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
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.
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.
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.
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.
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.
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.
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.