IZVRŠNI SAŽETAK

PROBLEM

FinTech platna platforma sa visokim protokom transakcija doživljavala je ozbiljne kaskadne padove tokom stvarnih skokova transakcionog opterećenja. Neposredni simptomi obuhvatali su iscrpljivanje niti, iscrpljivanje konekcionog pula baze podataka, nagli rast latencije i tajmaute transakcija. Forenzička analiza je pokazala da osnovni problem nije bio nedostatak infrastrukture. Sam model konkurentnosti postao je usko grlo.

REŠENJE

SWARCS je redizajnirao putanju upisa transakcija oko determinističkog vlasništva umesto arbitraže zasnovane na distribuiranim lock-ovima. Transakcije su ključane po account_id-u i rutirane kroz Kafku tako da se operacije koje pripadaju istom nalogu dodeljuju istoj particiji i obrađuju redosledom particije od strane konzumenta odgovornog za tu particiju. Redizajnirani tok kombinovao je particionisanu obradu događaja, validaciju stanja u memoriji i append-only perzistenciju. Time su distribuirane lock operacije uklonjene iz putanje upisa transakcija, a sistem je prešao sa koordinacije konkurentnih izvršilaca na rutiranje povezanog rada kroz determinističku processing putanju. Platforma je na taj način mogla da podrži značajno veći obim transakcija bez kaskadnog iscrpljivanja resursa koje je bilo prisutno u originalnom dizajnu.

KLJUČNI ARHITEKTONSKI POMAK

OD više distribuiranih čvorova koji se nadmeću za vlasništvo
→
KA determinističko rutiranje ka jednoj processing putanji

ZAKLJUČAK

Model konkurentnosti promenjen je sa koordinacije konkurentnog izvršavanja putem distribuiranih lock-ova na model u kome konkurentno izvršavanje koje dovodi do konflikta više nije potrebno za operacije koje pripadaju istom nalogu. Izmereni rezultati obuhvatili su smanjenje p99 latencije sa 4.500 ms na 18 ms, povećanje stabilnog protoka sa 3.200 TPS na 18.500+ TPS, smanjenje stope tajmauta transakcija sa 8,5% na 0,0% i smanjenje pritiska na konekcije baze podataka sa 100% na 26% u uslovima testiranog ciljnog opterećenja.

ARHITEKTONSKA ANALIZA

KONTEKST I POSLOVNI UTICAJ

Platforma posluje u domenu finansijskih tehnologija i platnih sistema. Obrađuje finansijske transakcije u realnom vremenu koje utiču na stanja naloga i knjigovodstveno stanje kroz hiljade istovremeno aktivnih naloga.

  • Domen: FinTech / platni sistemi
  • Obim: projektovano za podršku očekivanim transakcionim pikovima od približno 15.000 TPS
  • Transakcije u realnom vremenu utiču na stanja naloga i knjigovodstveno stanje kroz hiljade istovremeno aktivnih naloga

Kritična karakteristika originalnog sistema bila je nelinearna degradacija. Veći saobraćaj stvarao je veću kontenciju; kontencija je iscrpljivala zajedničke resurse; iscrpljivanje resursa izazivalo je dodatne greške i ponovljene pokušaje; a oni su ponovo povećavali saobraćaj.

NELINEARNA DEGRADACIJA

Veći saobraćaj
     |
     v
Veća kontencija
     |
     v
Iscrpljivanje zajedničkih resursa
     |
     v
Više grešaka i ponovljenih pokušaja
     |
     v
Veći saobraćaj

OSNOVNI UZROK: KONTENCIJA DISTRIBUIRANIH LOCK-OVA

Nasleđena arhitektura koristila je centralni Redis preko Redisson-a za međusobno isključivanje svaki put kada bi više aplikacionih čvorova pokušalo da ažurira stanje istog naloga. Pristup je bio funkcionalno ispravan pri umerenom opterećenju, ali je sa značajnim rastom transakcione konkurentnosti postao usko grlo u koordinaciji.

NASLEĐENA PUTANJA ZAHTEVA

[Istovremene transakcije]
            |
            v
+-----------------------+
| Spring Boot čvorovi   |
|                       |
| Više JVM niti         |
+-----------+-----------+
            |
            v
+-----------------------+
| Redisson distribuirani|
| lock / lease          |
|                       |
| Kontencija            |
+-----------+-----------+
            |
            v
+-----------------------+
| Ažuriranje naloga     |
|                       |
| Baza podataka         |
+-----------------------+

POVRATNA SPREGA

Veći saobraćaj
     |
     v
Veća kontencija lock-ova
     |
     v
Više blokiranih niti
     |
     v
Veći pritisak na konekcije
     |
     v
Veća latencija
     |
     v
Više isteka vremena
     |
     v
Više ponovljenih pokušaja
     |
     v
Veći saobraćaj

Povećanje infrastrukturnog kapaciteta nije rešavalo osnovni arhitektonski problem. Veći Redis kapacitet ili izmene parametara isteka vremena za lock mogli su da pomere tačku degradacije, ali bi sinhrona distribuirana arbitraža i dalje ostala deo transakcione putanje.

ARHITEKTONSKI UVID

DETERMINISTIČKO VLASNIŠTVO

     account_id
          |
          v
Deterministička particija
          |
          v
Jedinstvena putanja obrade
          |
          v
Sekvencijalna promena stanja naloga

Originalna arhitektura pokušavala je da obezbedi bezbedno konkurentno izvršavanje pomoću distribuiranih lock-ova. Redizajnirana arhitektura određuje putanju obrade pre izvršavanja, tako da operacije nad istim nalogom ne moraju da se nadmeću za distribuirani lock. Serijalizacija se primenjuje tamo gde je potrebno očuvati redosled promena stanja naloga. Nalozi raspoređeni na različite particije mogu da se obrađuju konkurentno, dok se nalozi na istoj particiji obrađuju u okviru iste sekvencijalne putanje.

ARHITEKTONSKA EVOLUCIJA

NASLEĐENI MODEL

+-------------------+
| Transakcija       |
+---------+---------+
          |
          v
+-------------------+
| Spring Boot čvor  |
+---------+---------+
          |
          v
+-------------------+
| Redis / Redisson  |
| Distribuirani lock|
+---------+---------+
          |
     +----+----+
     |         |
     v         v
  ČEKANJE   IZVRŠENJE
     |         |
     +----+----+
          |
          v
   Ažuriranje baze

REDIZAJNIRANI MODEL

         +-------------------+
         | Dolazna           |
         | transakcija       |
         +---------+---------+
                   |
                   v
         +-------------------+
         | Apache Kafka      |
         |                   |
         | Ključ: account_id |
         +---------+---------+
                   |
                   v
         +-------------------+
         | Kafka particija   |
         |                   |
         | Determinističko   |
         | rutiranje naloga  |
         +---------+---------+
                   |
                   v
         +-------------------+
         | Jedinstvena       |
         | putanja obrade    |
         |                   |
         | Sekvencijalne     |
         | promene stanja    |
         +---------+---------+
                   |
          +------------------+
          |                  |
          v                  v
+-------------------+  +-------------------+
| Caffeine          |  | Događaji se       |
| Stanje u memoriji |  | upisuju           |
| i validacija      |  | isključivo        |
+-------------------+  | dodavanjem        |
                       +---------+---------+
                                 |
                                 v
                  +-----------------------+
                  | account_events        |
                  |                       |
                  | Nepromenljivi događaji|
                  +-----------------------+

Transakcije se ključuju pomoću account_id. Kafka zato rutira transakcije sa istim ključem naloga u istu particiju, gde se odgovarajući zapisi preuzimaju redosledom kojim se nalaze u particiji.

SVOJSTVO RUTIRANJA NALOGA

Isti nalog
     |
     v
Ista particija
     |
     v
Ista putanja obrade
     |
     v
Sekvencijalne promene stanja

Unutar grupe potrošača, jedna particija je u datom trenutku dodeljena jednoj instanci potrošača. Kada se zapisi te particije obrađuju sekvencijalno, operacije nad istim nalogom primenjuju se redosledom particije, dok se različite particije mogu obrađivati konkurentno.

UPRAVLJANJE STANJEM I PERZISTENCIJA

  • Često korišćeno stanje naloga održava se u memoriji
  • Validacija transakcija izvršava se blizu putanje obrade
  • Promene stanja eksplicitno su predstavljene nepromenljivim zapisima stanja
  • Logika prelaza zasnovana na enum tipovima eksplicitno definiše promene stanja
  • Smanjena je nepotrebna sinhronizacija
  • Kritična transakciona putanja izbegava ponovnu rekonstrukciju aktivnog stanja kroz blokirajuće upite ka bazi

Redizajnirani model perzistencije menja interakciju sa bazom: umesto konkurentnih ažuriranja promenljivih redova naloga, transakcioni događaji upisuju se dodavanjem novih zapisa.

Prethodni model perzistencije:

Redizajnirani model perzistencije:

Svaka transakcija postaje operacija dodavanja zapisa umesto konkurentnog ažuriranja istog promenljivog reda naloga. Time se iz modela obrade uklanja prethodna zavisnost od koordinacije konkurentnih upisa na nivou relacionih redova i obezbeđuje trajni trag događaja koji predstavljaju promene stanja naloga.

Indeks omogućava efikasno učitavanje i rekonstrukciju istorije naloga, uz očuvanje modela perzistencije zasnovanog na dodavanju novih događaja.

KLJUČNE INŽENJERSKE ODLUKE

  1. Determinističko rutiranje poruka: account_id -> Kafka particija -> izvršni vlasnik. Povezane transakcije smeštaju se u istu particiju i obrađuju redosledom zapisa u njoj. Nalozi raspoređeni na različite particije mogu da se obrađuju konkurentno. Dinamička arbitraža distribuiranog vlasništva zamenjena je determinističkim rutiranjem.
  2. Uklanjanje distribuiranih lock-ova iz putanje upisa: Redis/Redisson uklonjen je iz kritične putanje koordinacije transakcija. Tok transakcije više ne zavisi od pribavljanja i obnavljanja distribuiranog lease-a pre svakog ažuriranja naloga, čime se uklanjaju troškovi sinhronizacije između čvorova i povezani načini otkaza.
  3. Serijalizacija tamo gde je zaista potrebna: promene finansijskog stanja jednog naloga zahtevaju definisan redosled, pa se serijalizacija primenjuje na putanji obrade naloga. Konkurentnost između particija ostaje očuvana, dok se povezane operacije obrađuju redom.
  4. Držanje često korišćenog stanja blizu procesora: stanje naloga održava se u Caffeine-u kako bi se aktivno stanje moglo validirati i menjati bez nepotrebnih blokirajućih čitanja iz baze.
  5. Perzistencija nepromenljivih događaja: baza postaje trajno skladište događaja zasnovano na dodavanju zapisa, umesto primarnog mehanizma sinhronizacije konkurentnih ažuriranja naloga. Redosled promena stanja odvaja se od trajnog upisa događaja.
  6. Izolacija potrošnje resursa: obrada po particijama obezbeđuje predvidiv model izvršavanja i sprečava da neograničena konkurentnost zahteva nekontrolisano optereti zajedničke Redis, JVM i resurse baze. Putanje obrade imaju kontrolisano izvršavanje i eksplicitno vlasništvo.

ARHITEKTONSKI ISHOD

PRE

Konkurentni upisivači
          |
          v
Zajedničko distribuirano stanje
          |
          v
Arbitraža distribuiranim lock-ovima
          |
          v
Kontencija resursa
          |
          v
Kaskadna degradacija

POSLE

Istovremene transakcije
          |
          v
Determinističko rutiranje naloga
          |
          v
Jedinstveni izvršni vlasnik
          |
          v
Sekvencijalne promene stanja naloga
          |
          v
Perzistencija dodavanjem događaja

Ključnu arhitektonsku razliku ne treba svesti na tvrdnju da je Redis zamenjen Kafkom.

Rezultat je transakciona putanja koja prelazi sa modela izvršavanja zasnovanog na kontenciji na deterministički model obrade sa eksplicitnim vlasništvom i kontrolisanom potrošnjom resursa.

KVANTIFIKOVANI REZULTATI

p99 latencija

PRE 4.500 ms
POSLE 18 ms

Smanjenje od 99,6%

Stabilna propusnost

PRE 3.200 TPS
POSLE 18.500+ TPS

Približno 5,8 puta veća

Stopa isteka vremena transakcija

PRE 8,5%
POSLE 0,0%

Nije uočeno pri testiranom opterećenju

Iskorišćenost pula konekcija baze

PRE 100%
POSLE 26%

Smanjenje od 74%

Operacije distribuiranih lock-ova

PRE Kontinuirano
POSLE 0 u putanji upisa

Uklonjene

  • 3.200 TPS predstavljalo je prethodnu granicu otkaza sistema
  • 18.500+ TPS predstavljalo je stabilnu, kontinuiranu obradu nakon redizajna
  • p99 latencija smanjena je sa 4.500 ms na 18 ms
  • Iskorišćenost pula konekcija baze smanjena je sa zasićenja na približno 26% pod uporedivim uslovima vršnog opterećenja
  • Rezultat na nivou baze nije postignut povećanjem veličine pula konekcija
  • Smanjenje je proisteklo iz uklanjanja blokirajućeg obrasca koordinacije koji je trošio zajedničke resurse
  • Registrovana stopa isteka vremena transakcija smanjena je sa približno 8,5% tokom perioda visokog opterećenja na 0% pri testiranom ciljnom opterećenju
  • Lanac pojačavanja opterećenja ponovljenim pokušajima uklonjen je iz kritičnog scenarija otkaza, umesto da granica degradacije bude samo pomerena na viši nivo saobraćaja

Redizajnirani sistem promenio je samu granicu otkaza: pri testiranom ciljnom opterećenju veći obim transakcija više nije reprodukovao prvobitni lanac kontencije distribuiranih lock-ova, iscrpljivanja resursa, isteka vremena i pojačavanja opterećenja ponovljenim pokušajima.

Redizajn je transformisao obradu transakcija iz modela konkurentnosti zasnovanog na kontenciji u determinističku obradu zasnovanu na vlasništvu nad nalogom. Izmereni rezultati obuhvatili su smanjenje p99 latencije sa 4.500 ms na 18 ms, povećanje stabilne propusnosti sa 3.200 TPS na više od 18.500 TPS, smanjenje stope isteka vremena transakcija sa 8,5% na 0,0%, smanjenje iskorišćenosti pula konekcija baze sa 100% na 26% i uklanjanje operacija distribuiranih lock-ova iz putanje upisa transakcija. Arhitektonska vrednost nije se ogledala samo u povećanju kapaciteta. Platforma je dobila suštinski drugačiju granicu otkaza uklanjanjem obrasca distribuirane koordinacije odgovornog za kaskadnu degradaciju.

INŽENJERSKI DOPRINOS

SWARCS je sproveo arhitektonsku forenziku ponašanja platforme tokom otkaza i perioda visoke konkurentnosti, identifikovao usko grlo u obradi i redizajnirao transakcioni tok oko determinističkog vlasništva nad particijama. Angažman je bio usmeren na osnovno ponašanje sistema, umesto na izolovano tretiranje pojedinačnih simptoma. Ključna arhitektonska promena bila je uklanjanje potrebe za distribuiranom sinhronizacijom, umesto pokušaja da se postojeći model zaključavanja neograničeno skalira.

ODGOVORNOSTI

  • Sprovedena arhitektonska forenzika putanje obrade transakcija
  • Identifikovana kontencija distribuiranih lock-ova kao usko grlo konkurentnosti
  • Analizirani iscrpljivanje niti, pritisak na konekcije baze, latencija, isteci vremena i pojačavanje opterećenja ponovljenim pokušajima kao delovi istog lanca otkaza
  • Redizajnirano rutiranje transakcija oko determinističkog vlasništva nad particijama prema account_id
  • Uvedena obrada događaja zasnovana na Kafka particijama za uređene operacije nad istim nalogom
  • Uklonjena distribuirana sinhronizacija Redis/Redisson iz putanje upisa transakcija
  • Projektovana validacija stanja naloga u memoriji korišćenjem Caffeine-a
  • Uvedeni nepromenljivi zapisi stanja i logika prelaza zasnovana na enum tipovima
  • Redizajnirana perzistencija oko događaja naloga koji se upisuju dodavanjem novih zapisa
  • Uspostavljeno indeksiranje ledger-a prema account_id i sequence_num za učitavanje i rekonstrukciju istorije naloga
  • Odvojen redosled promena stanja od trajne perzistencije događaja
  • Projektovane kontrolisane putanje obrade radi izolovanja potrošnje zajedničkih resursa
  • Validirano ponašanje sistema pod visokim ciljanim transakcionim opterećenjem

KLJUČNA PORUKA

PRESTANITE DA SE NADMEĆETE ZA VLASNIŠTVO. UČINITE VLASNIŠTVO DETERMINISTIČKIM.

Particionisati povezane transakcije pomoću account_id
Rutirati isti nalog kroz istu putanju obrade
Serijalizovati promene stanja tamo gde poslovni redosled to zahteva
Držati često korišćeno stanje blizu procesora
Ukloniti distribuirane lock-ove iz putanje upisa
Koristiti perzistenciju dodavanjem novih događaja za njihovo trajno čuvanje
Razdvojiti redosled promena stanja od trajnog upisa događaja
Tretirati kontenciju zajedničkih resursa kao arhitektonsko pitanje

Arhitektonski pomak nije bio samo zamena Redis-a Kafkom. Bio je to prelazak sa distribuirane koordinacije na determinističko vlasništvo. Rutiranjem svakog naloga kroz jednu putanju obrade, kontencija distribuiranih lock-ova uklonjena je iz kritične transakcione putanje. Konkurentnost između različitih particija ostala je očuvana. Rezultat nije bio samo brži sistem, već suštinski drugačiji model konkurentnosti i granica otkaza.