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 obrađuje FinTech platne transakcije u realnom vremenu koje utiču na stanja naloga i knjigovodstveno stanje kroz hiljade istovremeno aktivnih naloga. Ciljno opterećenje obuhvata transakcione pikove od približno 15.000 TPS.
Izazov je bio da se održi obrada transakcija pod visokim stepenom konkurentnosti, bez dozvoljavanja da troškovi koordinacije ugroze propusnost, latenciju ili konzistentnost stanja.
OSNOVNI UZROK: KONTENCIJA DISTRIBUIRANIH LOCK-OVA
Nasleđena arhitektura koristila je Redis preko Redisson-a da obezbedi međusobno isključivanje kada više aplikacionih čvorova pokuša da ažurira stanje istog naloga. Sa porastom konkurentnosti transakcija, pribavljanje distribuiranih lock-ova i čekanje na njih postali su usko grlo u transakcionoj putanji.
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 PONOVLJENIH POKUŠAJA
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
Ponovljeni pokušaji sa klijentske strane pojačavali su opterećenje već degradirane putanje obrade. Dodatni infrastrukturni kapacitet ili drugačija podešavanja isteka vremena za lock mogli su da promene trenutak nastupanja degradacije, ali nijedna od tih mera ne bi uklonila distribuiranu arbitražu iz transakcione putanje.
ARHITEKTONSKI UVID
DETERMINISTIČKO VLASNIŠTVO
account_id
|
v
Deterministička particija
|
v
Jedinstvena putanja obrade
|
v
Sekvencijalna promena stanja naloga
Ključna promena odnosi se na mesto na kojem se kontroliše konkurentnost. Umesto arbitriranja o vlasništvu pomoću distribuiranih lock-ova, sistem usmerava transakcije za isti nalog u istu Kafka particiju i obrađuje njene zapise sekvencijalno. Različite particije mogu da napreduju konkurentno, dok nepovezani nalozi dodeljeni istoj particiji dele njenu granicu obrade.
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 | | Perzistencija |
| Stanje u memoriji | | događaja |
| i validacija | | dodavanjem zapisa |
+-------------------+ +-------------------+
|
v
+-----------------------+
| account_events |
| |
| Nepromenljivi događaji|
+-----------------------+
Kafka zapisi koriste account_id kao ključ, čime se, prema konfigurisanom modelu particionisanja, zapisi za isti nalog usmeravaju u istu particiju. Zapisi se obrađuju sekvencijalno unutar particije, uz očuvanje redosleda zapisa u njoj. Grupa potrošača dodeljuje particiju jednoj instanci potrošača u datom trenutku, mada se dodela može promeniti tokom rebalance-a. Paralelna obrada odvija se između particija, a ne između zapisa koji dele istu granicu obrade particije.
UPRAVLJANJE STANJEM I PERZISTENCIJA
Sloj zasnovan na Caffeine-u održava često korišćeno stanje naloga u memoriji, blizu procesora, i omogućava validaciju transakcija bez ponovnog rekonstruisanja aktivnog stanja kroz blokirajuća čitanja iz baze podataka. Nepromenljivi zapisi stanja i eksplicitna logika zasnovana na enum tipovima čine prelaze između stanja jasno definisanim.
Model perzistencije promenjen je tako da umesto konkurentnih ažuriranja promenljivih redova naloga koristi model događaja naloga zasnovan na dodavanju novih zapisa.
Promena stanja i trajni upis događaja obuhvaćeni su istom atomskom transakcijom baze podataka. Time je obezbeđena njihova atomarnost unutar transakcije baze; to ne podrazumeva atomarnu koordinaciju sa kešom u memoriji ili upravljanjem Kafka offset-ima.
Kompozitni indeks omogućava pretraživanje događaja za pojedinačni nalog i pristup istoriji ledger-a prema rednom broju. Sam indeks ne definiše način dodeljivanja rednih brojeva niti garantuje određeni postupak oporavka.
KLJUČNE INŽENJERSKE ODLUKE
Determinističko rutiranje poruka: koristiti account_id kao ključ Kafka particije, tako da zapisi za isti nalog prate istu uređenu putanju obrade.
Uklanjanje distribuiranih lock-ova iz putanje upisa: ukloniti operacije zaključavanja Redis/Redisson iz kritične transakcione putanje, umesto podešavanja mehanizma koji izaziva kontenciju.
Držanje aktivnog stanja blizu obrade: koristiti stanje naloga u memoriji, podržano Caffeine-om, za validaciju transakcija, uz nepromenljive zapise stanja i eksplicitne prelaze zasnovane na enum tipovima.
Perzistencija nepromenljivih događaja: zameniti konkurentna ažuriranja promenljivih redova dodavanjem događaja naloga, pri čemu se svaka promena stanja i odgovarajući trajni događaj upisuju u okviru iste atomske transakcije baze podataka.
Validacija kompletne putanje obrade: zajednički procenjivati propusnost, p99 latenciju, stopu isteka vremena i iskorišćenost HikariCP pula kako bi se utvrdio efekat arhitektonske promene.
ARHITEKTONSKI ISHOD
Redizajn je promenio model konkurentnosti, a ne samo zamenio Redis Kafkom. Povezane transakcije sada prate determinističku, uređenu putanju obrade, a trajni transakcioni događaji dodaju se kao novi zapisi umesto da se konkurentnim ažuriranjima menja isti promenljivi red naloga.
Time se granica obrade definiše kroz model rutiranja, dok nezavisne particije mogu da napreduju konkurentno. Izmereni rezultati pokazuju poboljšanje pri testiranom opterećenju, bez tvrdnje da su svi mogući isteci vremena ili operativni otkazi eliminisani.
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 stabilna propusnost
Stopa isteka vremena transakcija
PRE
8,5%
POSLE
0,0%
Nije uočeno pri testiranom opterećenju
Iskorišćenost HikariCP pula
PRE
100%
POSLE
26%
Smanjenje od 74%
Operacije distribuiranih lock-ova
PRE
Kontinuirano
POSLE
0 u putanji upisa
Uklonjene
Ciljno opterećenje obuhvatalo je transakcione pikove od približno 15.000 TPS; ovaj cilj razlikuje se od izmerene stabilne propusnosti.
Maksimalna konfiguracija HikariCP pula ostala je 50 konekcija po aplikacionom čvoru.
Stopa isteka vremena od 0,0% odnosi se na testirano opterećenje i ne dokazuje da su isteci vremena nemogući u svim operativnim uslovima.
Na izmerenom opterećenju, redizajn je objedinio veću stabilnu propusnost sa znatno nižom repnom latencijom i manjom iskorišćenošću pula konekcija. Rezultat u pogledu isteka vremena pruža dodatni dokaz poboljšanog ponašanja pod tim uslovima, dok uklanjanje operacija distribuiranih lock-ova potvrđuje suštinsku arhitektonsku promenu.
Determinističko rutiranje promenilo je način kontrole konkurentnosti transakcija: povezani posao pratio je uređenu putanju obrade bez distribuiranih lock-ova u putanji upisa. Pri testiranom opterećenju, izmereni rezultati pokazuju poboljšanja propusnosti, repne latencije, ponašanja u pogledu isteka vremena i iskorišćenosti pula konekcija.
INŽENJERSKI DOPRINOS
SWARCS je sproveo arhitektonsku forenziku putanje obrade transakcija, identifikovao kontenciju distribuiranih lock-ova kao ključno usko grlo i redizajnirao obradu oko determinističkog rutiranja naloga. Rad je obuhvatio međusobni uticaj čekanja na lock-ove, raspoloživosti radnih niti, pritiska na konekcije baze, latencije i ponovljenih pokušaja klijenata, umesto da se ovi simptomi tretiraju nezavisno.
ODGOVORNOSTI
Analizirana transakciona putanja radi identifikovanja izvora kontencije pri visokoj konkurentnosti
Utvrđena veza između blokiranih radnih niti, iskorišćenosti HikariCP pula, latencije, isteka vremena i ponovljenih pokušaja
Redizajnirano rutiranje transakcija na osnovu Kafka particionisanja prema account_id
Uklonjene operacije distribuiranih lock-ova Redis/Redisson iz putanje upisa transakcija
Uvedeni validacija stanja naloga u memoriji uz Caffeine i eksplicitna logika prelaza između stanja
Promenjena perzistencija sa konkurentnih ažuriranja promenljivih redova na dodavanje događaja naloga
Uvedeno indeksiranje prema account_id i sequence_num radi pristupa istoriji događaja pojedinačnog naloga
Redizajnirana putanja obrade procenjena na osnovu propusnosti, p99 latencije, isteka vremena i merenja iskorišćenosti pula konekcija
KLJUČNA PORUKA
PRESTANITE DA SE NADMEĆETE ZA VLASNIŠTVO. UČINITE VLASNIŠTVO DETERMINISTIČKIM.
Rutirati povezane transakcije prema account_id
Obrađivati zapise sekvencijalno unutar svake particije
Očuvati paralelizam između nezavisno obrađivanih particija
Ukloniti distribuirane lock-ove iz putanje upisa transakcija
Razdvojiti aktivno stanje u memoriji od trajne istorije događaja
Meriti ponašanje kompletne transakcione putanje pod opterećenjem
Suštinsko poboljšanje bilo je promena kontrole konkurentnosti, a ne samo promena infrastrukturnih komponenti. Determinističko rutiranje odredilo je gde se obrađuju povezane transakcije, dok je perzistencija dodavanjem novih zapisa odredila kako se njihovi trajni događaji čuvaju.
Rezultujuća arhitektura smanjila je kontenciju u transakcionoj putanji, uz očuvanje mogućnosti paralelne obrade između particija.