#Backend

A mérnökök terepi útmutatót kapnak a fintech rendszerekhez

Marta Kowalska
Marta Kowalska
7 min read

A Fintech Engineering Handbook praktikus útmutatót ad a szoftvercsapatoknak olyan rendszerek építéséhez, amelyek pénzt mozgatnak, rögzítenek és auditálnak anélkül, hogy értéket találnának ki vagy veszítenének el.

A Fintech Engineering Handbook gyakorlati mintakészletet ad azoknak a mérnököknek, akik pénz köré építenek szoftvert, a főkönyvi tervezéstől és az idempotenciától kezdve a webhookokon, egyeztetésen, hozzáférés-szabályozáson és a produkciós tesztelésen át.

A kézikönyv azoknak a mérnököknek szól, akik más szoftveres területekről érkeznek a fintechbe. Egy közösségi alkalmazás helyre tud állni egy duplikált értesítésből. Egy pénzrendszer viszont nem legyinthet el egy duplikált kifizetést, egy lekerekítéssel eltűnt díjat vagy egy hiányzó elszámolási rekordot. Az útmutató ezt a munkát három szabály köré rendezi: ne találj ki adatot, ne veszíts el adatot, és ne bízz sem külső, sem belső rendszerekben ellenőrzés nélkül.

Az első lecke a reprezentációval kezdődik. A pénzhez összeg és pénznem kell, kellő pontossággal tárolva az adott feladathoz. A kézikönyv óva int a lebegőpontos típusoktól pénzügyi összegek esetén, mert a gyakori parsolók és futtatókörnyezetek kerekítési hibákat vezethetnek be egy egyébként gondosan felépített rendszer szélén. Ehelyett fix kisebb egységeket, tetszőleges pontosságú decimálisokat, racionális számokat vagy ezek kombinációját javasolja, attól függően, hogy a rendszer egyenlegeket tárol, árfolyamokat számol, vagy kriptoeszközöket kezel.

Ez a megkülönböztetés számít. Egy 12,34 dolláros fiat egyenleg elférhet 1234 centként az ISO 4217 pénznem-metaadatai alatt. Egy kriptotoken használhat 18 tizedesjegyet, és túlcsordíthat egy 64 bites egész típust. Egy nyers JSON-szám felülírhatja a gondos belső tervezést, ha egy kliens IEEE 754 dupla pontosságú értékként értelmezi. A kézikönyv arra ösztönzi a mérnököket, hogy a pénzt inkább stringként vagy legkisebb egységű egészként küldjék.

Az útmutató a kerekítést üzleti döntésnek tekinti, nem formázási kérdésnek. A díjszámítások, devizakonverziók, kamatok és árfolyamalkalmazások mind létrehozhatnak törteket, amelyeket a rendszernek el kell osztania. A csapatoknak el kell dönteniük, ki kapja meg vagy ki veszti el a maradékot, rögzíteniük kell a fennmaradó részt, és kerülniük kell a kerekítést a peremekig, például a perzisztálásig vagy a megjelenítésig. Ha egy platform egy fizetést több részre bont, előfordulhat, hogy a kerekített részek már nem adják ki az eredeti összeget. A kézikönyv azt javasolja, hogy a csapatok ezt a különbséget kövessék nyomon, ne rejtsék el.

A főkönyvi rész adja a kézikönyv központi súlypontját. Az útmutató a kettős könyvelést mérnöki mintaként magyarázza: minden mozgás jóváír egy számlát és megterhel egy másikat, így a pénznek van forrása és célállomása. A külső szolgáltatók is számlákat kapnak. A felhasználói egyenlegek könyvelési tételekből származnak, nem módosítható balance mezőkből. A javítások új, hivatkozott bejegyzésekkel történnek, nem a már rögzített rekordok szerkesztésével.

Ez a megközelítés auditálható nyomvonalat ad. Egy pénzügyi rendszernek el kell tudnia magyarázni, mi történt, ki indította el, mikor könyvelte a rendszer, miért történt, és mely forrásadatok támasztották alá a döntést. A kézikönyv elkülöníti az érték időpontját, a könyvelési időpontot és az elszámolási időpontot, mert ezek a dátumok különböző kérdésekre válaszolnak. Egy kártyatranzakció hétfőn történhet, kedden kerülhet be a cég rendszerébe, és pénteken számolódhat el a bank felé. Ha ezeket a dátumokat egyetlen created_at mezőbe olvasztjuk, elvesznek olyan tények, amelyeket a csapat később már nem tud visszaállítani.

A kézikönyv az eseményforrásos megközelítést is óvatosan kezeli. Az event sourcing erős auditnyomot adhat a csapatoknak, mert az eseménynapló a derivált állapot forrásává válik. Az útmutató nem univerzális válaszként árulja ezt. A mérnököknek továbbra is szükségük van leképezésekre, pillanatképekre, sémamigrációra és olyan eszközökre, amelyek az évekig megőrzendő régi eseményeket kezelik. Sok környező domain esetében a kézikönyv szerint egy hagyományos modell megbízható változásnaplóval kisebb üzemeltetési költséggel teljesítheti az igényt.

A végrehajtási minták az útmutató egy másik nagy részét teszik ki. Az idempotencia külön figyelmet kap, mert a fintech rendszerek szándékosan újrapróbálják a hívásokat. Egy kifizetési kérés időtúlléphet azután, hogy a szolgáltató megkapta. Az ügyfél újrapróbálhatja. A szervernek ezt az ismételt kézbesítést egyetlen hatásra kell összevonnia. A kézikönyv explicit idempotencia kulcsokat részesít előnyben, kliensre és műveletre szűkítve, valamint olyan atomi védőkorlátokat, amelyek kezelik a két egyforma kérés egyidejű érkezését.

A fedezetlefoglalás egy másik versenyhelyzetet kezel. Mielőtt egy platform pénzt küldene ki vagy compliance-szolgáltatót hívna, lefoglalja a szükséges összeget a felhasználó rendelkezésre álló egyenlegéből. A felhasználó továbbra is birtokolja az összeget, de a rendszer megakadályozza, hogy egy másik tranzakció ugyanazt a pénzt költse el. Az útmutató egy kemény követelményt világossá tesz: az egyenleg ellenőrzésének és a lefoglalás rögzítésének erős konzisztenciára van szüksége. Egy elavult olvasás megengedheti, hogy két kifizetés ugyanarra a fedezetre fusson rá.

A kézikönyv nem tesz úgy, mintha a lefoglalás megszüntetné a túlköltést. Külső rendszerek magasabb, mint várt elszámolás, visszafordítások, chargebackek vagy késleltetett díjak révén negatív egyenleget okozhatnak. Az útmutató óva int attól, hogy a nemnegatív egyenleget unsigned típussal vagy olyan adatbázis-korlátozással kódoljuk, amely elutasítja a valóságot. Egy rendszer, amely nem képes negatív egyenleget ábrázolni, összeomolhat, nullára vághatja az értéket, vagy rossz javítási úton pénzt teremthet. A kézikönyv azt mondja a csapatoknak: könyveljék a túllépést, vizsgálják ki, és a jövőbeli befizetéseken, visszafizetésen vagy egy veszteségszámlán keresztül állítsák helyre.

A külső integrációk ugyanezt a bizalmatlanságot kapják. Fizetésfeldolgozók, bankok, letétkezelők, KYC-szolgáltatók, AML-szolgáltatók, blokklánc csomópontok és belső szolgáltatások is adhatnak hibás payloadokat, elavult rekordokat, duplikált üzeneteket vagy éppen semmit. A kézikönyv azt tanácsolja a csapatoknak, hogy validálják azokat a mezőket, amelyekre támaszkodnak, tárolják a kéréseket és válaszokat lekérdezhető formában, és végezzenek papírszintű számolást a szolgáltatói kvótákon, mielőtt a forgalom elérné a limitet.

A webhookokat keményen kezeli. Egy webhooknak ellenőrzést kell indítania, nem tényt elszámolnia. Az útmutató azt javasolja, hogy a nyers bájtokon ellenőrizzük az aláírásokat, mentsük el a nyers payloadot, gyorsan adjunk nyugtázást, és a munkát a kérés útvonalán kívül dolgozzuk fel. A csapatoknak le kell kérdezniük a szolgáltató API-ját az aktuális állapotért, és egyeztetési feladatokat kell építeniük azokról a webhookokról, amelyek sosem érkeznek meg. Ugyanaz az esemény kétszer vagy sorrenden kívül is megérkezhet, ezért a webhookkezelőknek idempotenciára és állapotellenőrzésekre van szükségük.

A kézikönyv ezt a mintát a megbízható publikáláshoz köti. Egy rendszer, amely frissíti az adatbázisát, majd külön lépésben Kafka eseményt vagy kimenő webhookot küld, a két lépés között elbukhat. Az útmutató az outbox mintát, a change data capture-t és az event sourcingot gyakorlati válaszként írja le. Olyan eszközök, mint a Debezium, az AWS Database Migration Service, a Temporal, a Camunda és az AWS Step Functions ennek a térnek részeit fedik le, bár mindegyik saját modellt és üzemeltetési terhet hoz.

Az egyeztetés jelenti a védőhálót. A kézikönyv arra ösztönzi a csapatokat, hogy hasonlítsák össze a főkönyvüket a processzorokkal, bankokkal, letétkezelőkkel, blokkláncokkal és más független forrásokkal. Egy eltérés jelenthet hiányzó adatot, eltérő összeget, elavult elszámolást vagy egy-a-többhöz kötegelt átutalásokat. Az útmutató óva int attól, hogy az egyik oldalt felülírjuk, csak hogy a riport zöld legyen. A mérnököknek első osztályú javításokra, újrafeldolgozási útvonalakra és olyan illesztési logikára van szükségük, amely tiszteletben tartja az elszámolási időzítést.

Az ellenőrzések szakasza kiterjeszti a bizalmatlanság fogalmát a cégen belüli alkalmazottakra és rendszerekre is. Érzékeny pénzügyi műveletek, díjmódosítások, éles telepítések és infrastruktúraváltozások esetén szükség lehet feladatok szétválasztására vagy maker-checker jóváhagyásra. Maga a jóváhagyás is nyomot igényel: kérelmező, jóváhagyó, indoklás, időbélyeg és bizonyíték arra, hogy ugyanaz a személy nem töltötte be mindkét szerepet. A hozzáférés-szabályozás ugyanezt a bánásmódot kapja a legkisebb jogosultság, a szerepköralapú hozzáférés, a változási nyomvonal és a periodikus felülvizsgálatok révén.

A kézikönyv a teszteléssel zárul, olyan technikákkal, amelyek a pénzügyi állapothoz jobban illenek, mint az egyszerű példaalapú ellenőrzések önmagukban. A property-based tesztelés műveletsorokat generálhat, és minden lépés után ellenőrizheti, hogy a könyvek egyensúlyban vannak-e. A crash injection minden két lépés közötti ponton megölhet egy hosszú futású folyamatot, és bizonyíthatja, hogy egy worker folytatni tudja. A golden tesztek rögzíthetik a díjbontásokat vagy kivonatokat felülvizsgált kimenetekhez. A visszafelé kompatibilitási tesztek a régi esemény payloadokat olvashatónak tarthatják a séma változásai után is.

A kézikönyv végigvezetett példái kézzelfoghatóvá teszik a mintákat. Egy kriptokivét összekapcsolja az idempotens beküldést, a fedezetlefoglalást, a compliance-ellenőrzéseket, az on-chain broadcastot, a megerősítési mélységet, a főkönyvi tételeket, a díjelszámolást és a láncegyeztetést. Egy kártyás befizetés megmutatja, miért kell egy platformnak a capture webhookot jelzésként kezelnie, a jóváírást clearing számlán keresztül könyvelnie, megvárnia az elszámolást, és a chargebackeket kapcsolt visszafordításokon át kezelnie. Egy alkalmazáson belüli átváltás cashbackkel megmutatja, miért kell a spreadnek, a kerekítésnek, a referenciaárfolyamoknak és a promóciós pénznek mind főkönyvi bejegyzésekkel rendelkeznie.

A projekt nem jelent be finanszírozást, befektetőket vagy kereskedelmi indulást. Piaci pozíciója egy másik hiányból fakad: sok mérnök erős elosztott rendszerekkel kapcsolatos tudással érkezik a fintechbe, de kevés tapasztalata van a könyvelésről, elszámolásról, letétkezelésről, szankcióellenőrzésekről, chargebackekről és auditbizonyítékokról. A kézikönyv ezeket az aggályokat szoftvermintákként csomagolja, nem pénzügyi folklórként.

Ezért az útmutató túlmutat a fintech startupokon. Bármely csapat, amely egyenlegeket tárol, eszközöket mozgat, promóciós összegeket ír jóvá, pénzügyi jelentéseket állít elő, vagy fizetési szolgáltatókkal integrálódik, ugyanazzal a nyomással szembesül. A pénzügyi szoftver a szolgáltatások, időbélyegek, újrapróbálkozások és emberi felülbírálások közötti repedésekben bukik el. A kézikönyv nyelvet ad a mérnököknek ezekhez a repedésekhez, és egy olyan ellenőrzési készletet, amelyet kóddá alakíthatnak.

Hozzászólások

Hozzászólások betöltése...