Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

Hej alla! Jag heter Sergey Kostanbaev, pÄ börsen utvecklar jag kÀrnan i handelssystemet.

NĂ€r Hollywood-filmer visar New York-börsen ser det alltid ut sĂ„ hĂ€r: folkmassor, alla skriker nĂ„got, viftar med papper, totalt kaos uppstĂ„r. Detta har aldrig hĂ€nt hĂ€r pĂ„ Moskvabörsen, eftersom handeln har bedrivits elektroniskt frĂ„n allra första början och Ă€r baserad pĂ„ tvĂ„ huvudplattformar – Spectra (valutamarknaden) och ASTS (valuta-, aktie- och penningmarknaden). Och idag vill jag prata om utvecklingen av arkitekturen för ASTS-handels- och clearingsystemet, om olika lösningar och fynd. Historien kommer att bli lĂ„ng, sĂ„ jag var tvungen att dela upp den i tvĂ„ delar.

Vi Àr en av fÄ börser i vÀrlden som handlar med tillgÄngar av alla klasser och tillhandahÄller ett komplett utbud av börstjÀnster. Till exempel, förra Äret rankades vi tvÄa i vÀrlden nÀr det gÀller volym för obligationshandel, 25:e plats bland alla börser, 13:e plats i kapitalisering bland offentliga börser.

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

För professionella handelsdeltagare Àr sÄdana parametrar som svarstid, stabilitet i tidsfördelning (jitter) och tillförlitlighet för hela komplexet avgörande. Vi behandlar för nÀrvarande tiotals miljoner transaktioner per dag. Bearbetningen av varje transaktion av systemkÀrnan tar tiotals mikrosekunder. Visst har mobiloperatörer pÄ nyÄrsafton eller sökmotorer sjÀlva en högre arbetsbelastning Àn vÄr, men vad gÀller arbetsbelastning, i kombination med ovan nÀmnda egenskaper, Àr det fÄ som kan mÀta sig med oss, tycks det mig. Samtidigt Àr det viktigt för oss att systemet inte saktar ner en sekund, fungerar absolut stabilt och att alla anvÀndare Àr jÀmstÀllda.

Lite historia

1994 lanserades det australiensiska ASTS-systemet pÄ Moscow Interbank Currency Exchange (MICEX), och frÄn det ögonblicket kan den ryska historien om elektronisk handel rÀknas. 1998 moderniserades börsarkitekturen för att introducera internethandel. Sedan dess har implementeringshastigheten för nya lösningar och arkitektoniska förÀndringar i alla system och delsystem bara tagit fart.

Under dessa Är fungerade utbytessystemet pÄ avancerad hÄrdvara - ultratillförlitliga HP Superdome 9000-servrar (byggda pÄ PA-RISC), dÀr absolut allt duplicerades: in-/utgÄngsundersystem, nÀtverk, RAM (det fanns faktiskt en RAID-array av RAM), processorer (hot-swappable). Det var möjligt att Àndra vilken serverkomponent som helst utan att stoppa maskinen. Vi litade pÄ dessa enheter och ansÄg att de var praktiskt taget felsÀkra. Operativsystemet var ett Unix-liknande HP UX-system.

Men sedan omkring 2010 har det uppstĂ„tt ett fenomen som kallas högfrekvenshandel (HFT), eller högfrekvenshandel – enkelt uttryckt, börsrobotar. PĂ„ bara 2,5 Ă„r har belastningen pĂ„ vĂ„ra servrar ökat 140 gĂ„nger.

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

Det var omöjligt att stÄ emot en sÄdan belastning med den gamla arkitekturen och utrustningen. Det var nödvÀndigt att pÄ nÄgot sÀtt anpassa sig.

börjar

FörfrÄgningar till utbytessystemet kan delas in i tvÄ typer:

  • Transaktioner. Om du vill köpa dollar, aktier eller nĂ„got annat skickar du en transaktion till handelssystemet och fĂ„r svar om framgĂ„ng.
  • InformationsförfrĂ„gningar. Om du vill ta reda pĂ„ det aktuella priset, se orderboken eller indexen och skicka sedan informationsförfrĂ„gningar.

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

Schematiskt kan kÀrnan i systemet delas in i tre nivÄer:

  • KundnivĂ„n, pĂ„ vilken mĂ€klare och kunder arbetar. De interagerar alla med Ă„tkomstservrar.
  • Gatewayservrar Ă€r cachningsservrar som lokalt behandlar alla informationsförfrĂ„gningar. Vill du veta vilket pris Sberbanks aktier för nĂ€rvarande handlas till? BegĂ€ran gĂ„r till Ă„tkomstservern.
  • Men om du vill köpa aktier gĂ„r förfrĂ„gan till den centrala servern (Trade Engine). Det finns en sĂ„dan server för varje typ av marknad, de spelar en viktig roll, det Ă€r för dem som vi skapade det hĂ€r systemet.

KÀrnan i handelssystemet Àr en smart minnesdatabas dÀr alla transaktioner Àr utbytestransaktioner. Basen skrevs i C, de enda externa beroenden var libc-biblioteket och det fanns ingen dynamisk minnesallokering alls. För att minska bearbetningstiden börjar systemet med en statisk uppsÀttning arrayer och med statisk dataflyttning: först laddas all data för den aktuella dagen in i minnet, och ingen ytterligare diskÄtkomst utförs, allt arbete utförs endast i minnet. NÀr systemet startar Àr all referensdata redan sorterad, sÄ sökningen fungerar mycket effektivt och tar kort tid under körning. Alla tabeller Àr gjorda med pÄtrÀngande listor och trÀd för dynamiska datastrukturer sÄ att de inte krÀver minnesallokering vid körning.

LÄt oss kort gÄ igenom historien om utvecklingen av vÄrt handels- och clearingsystem.
Den första versionen av handels- och clearingsystemarkitekturen byggdes pÄ den sÄ kallade Unix-interaktionen: delat minne, semaforer och köer anvÀndes och varje process bestod av en enda trÄd. Detta tillvÀgagÄngssÀtt var utbrett i början av 1990-talet.

Den första versionen av systemet innehöll tvÄ nivÄer av Gateway och en central server för handelssystemet. Arbetsflödet var sÄ hÀr:

  • Klienten skickar en begĂ€ran som nĂ„r Gatewayen. Den kontrollerar formatets giltighet (men inte sjĂ€lva data) och avvisar felaktiga transaktioner.
  • Om en informationsbegĂ€ran har skickats, utförs den lokalt; om vi pratar om en transaktion omdirigeras den till den centrala servern.
  • Handelsmotorn bearbetar sedan transaktionen, modifierar lokalt minne och skickar ett svar pĂ„ transaktionen och sjĂ€lva transaktionen för replikering med hjĂ€lp av en separat replikeringsmotor.
  • Gatewayen tar emot svaret frĂ„n den centrala noden och vidarebefordrar det till klienten.
  • Efter en tid tar Gatewayen emot transaktionen genom replikeringsmekanismen, och den hĂ€r gĂ„ngen exekverar den lokalt och Ă€ndrar dess datastrukturer sĂ„ att nĂ€sta informationsförfrĂ„gningar visar den senaste informationen.

Faktum Àr att den beskriver en replikeringsmodell dÀr Gateway fullstÀndigt replikerade de ÄtgÀrder som utfördes i handelssystemet. En separat replikeringskanal sÀkerstÀllde att transaktioner utfördes i samma ordning över flera Ätkomstnoder.

Eftersom koden var entrÄdig anvÀndes ett klassiskt schema med processgafflar för att betjÀna mÄnga kunder. Det var dock vÀldigt dyrt att dela hela databasen, sÄ lÀtta tjÀnsteprocesser anvÀndes som samlade in paket frÄn TCP-sessioner och överförde dem till en kö (SystemV Message Queue). Gateway och Trade Engine fungerade bara med denna kö och tog transaktioner dÀrifrÄn för exekvering. Det gick inte lÀngre att skicka ett svar pÄ det, eftersom det inte var klart vilken serviceprocess som skulle lÀsa den. SÄ vi tog till ett knep: varje splittrad process skapade en svarskö för sig sjÀlv, och nÀr en förfrÄgan kom in i den inkommande kön lades en tagg för svarskön omedelbart till den.

Att stÀndigt kopiera stora mÀngder data frÄn kö till kö skapade problem, sÀrskilt typiska för informationsförfrÄgningar. DÀrför anvÀnde vi ett annat knep: förutom svarskön skapade varje process ocksÄ delat minne (SystemV Shared Memory). SjÀlva paketen placerades i den, och endast en tagg lagrades i kön, sÄ att man kunde hitta originalpaketet. Detta hjÀlpte till att lagra data i processorns cache.

SystemV IPC innehÄller verktyg för att visa tillstÄndet för kö-, minnes- och semaforobjekt. Vi anvÀnde detta aktivt för att förstÄ vad som hÀnde i systemet vid ett visst tillfÀlle, var paket samlades, vad som blockerades etc.

Första uppgraderingarna

Först och frÀmst blev vi av med enprocess Gateway. Dess betydande nackdel var att den kunde hantera antingen en replikeringstransaktion eller en informationsbegÀran frÄn en klient. Och nÀr belastningen ökar kommer Gateway att ta lÀngre tid att behandla förfrÄgningar och kommer inte att kunna bearbeta replikeringsflödet. Dessutom, om kunden skickade en transaktion, behöver du bara kontrollera dess giltighet och vidarebefordra den. DÀrför ersatte vi den enda Gateway-processen med flera komponenter som kan köras parallellt: flertrÄdad information och transaktionsprocesser som körs oberoende av varandra pÄ ett delat minnesomrÄde med hjÀlp av RW-lÄsning. Och samtidigt introducerade vi leverans- och replikeringsprocesser.

Effekten av högfrekvent handel

Den ovan beskrivna arkitekturversionen varade fram till 2010. Samtidigt var vi inte lĂ€ngre nöjda med prestandan hos HP Superdome-servrarna. Dessutom var PA-RISC-arkitekturen i princip död, och leverantören erbjöd inga betydande uppdateringar. Som ett resultat började vi migrera frĂ„n HP UX/PA RISC till Linux/x86. ÖvergĂ„ngen började med anpassningen av Ă„tkomstservrar.

Varför var vi tvungna att Àndra arkitekturen igen? Faktum Àr att högfrekvent handel har vÀsentligt förÀndrat belastningsprofilen pÄ systemkÀrnan.

LÄt oss sÀga att vi har en liten transaktion som orsakade en betydande prisförÀndring - nÄgon köpte en halv miljard dollar. Efter ett par millisekunder mÀrker alla marknadsaktörer detta och börjar göra en korrigering. Naturligtvis hamnar förfrÄgningar i en enorm kö, som systemet kommer att ta lÄng tid att rensa.

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

Med detta 50 ms-intervall Ă€r medelhastigheten cirka 16 tusen transaktioner per sekund. Om vi ​​minskar fönstret till 20 ms fĂ„r vi en genomsnittlig hastighet pĂ„ 90 tusen transaktioner per sekund, med 200 tusen transaktioner pĂ„ topp. Med andra ord Ă€r belastningen inte konstant, med plötsliga skurar. Och kön av förfrĂ„gningar ska alltid behandlas snabbt.

Men varför Àr det kö överhuvudtaget? SÄ i vÄrt exempel mÀrkte mÄnga anvÀndare prisÀndringen och skickade transaktioner dÀrefter. De kommer till Gateway, den serialiserar dem, sÀtter en viss ordning och skickar dem till nÀtverket. Routrar blandar paketen och vidarebefordrar dem. Vems paket kom först, den transaktionen "vann". Som ett resultat började utbytesklienter mÀrka att om samma transaktion skickades frÄn flera gateways, sÄ ökade chanserna för snabb bearbetning. Snart började utbytesrobotar bombardera Gateway med förfrÄgningar, och en lavin av transaktioner uppstod.

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

En ny omgÄng av evolution

Efter omfattande tester och forskning övergick vi till en realtidsbaserad kÀrna för operativsystemet. Vi valde RedHat Enterprise MRG för detta ÀndamÄl. Linux, dÀr MRG stÄr för messaging real-time grid. Fördelen med realtidspatchar Àr att de optimerar systemet för maximal exekveringshastighet: alla processer Àr ordnade i en FIFO-kö, kÀrnor kan isoleras, det finns inga droppar och alla transaktioner behandlas i strikt sekvens.

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1
Röd - arbetar med en kö i en vanlig kÀrna, grön - arbetar i en realtidskÀrna.

Men att uppnÄ lÄg latens pÄ vanliga servrar Àr inte sÄ lÀtt:

  • SMI-lĂ€get, som i x86-arkitekturen Ă€r grunden för att arbeta med viktig kringutrustning, stör kraftigt. Bearbetning av alla typer av hĂ„rdvaruhĂ€ndelser och hantering av komponenter och enheter utförs av den fasta programvaran i det sĂ„ kallade transparenta SMI-lĂ€get, dĂ€r operativsystemet inte alls ser vad den fasta programvaran gör. Som regel erbjuder alla större leverantörer speciella tillĂ€gg för firmware-servrar som gör det möjligt att minska mĂ€ngden SMI-bearbetning.
  • Det ska inte finnas nĂ„gon dynamisk styrning av processorfrekvensen, detta leder till ytterligare stillestĂ„nd.
  • NĂ€r filsystemloggen töms, intrĂ€ffar vissa processer i kĂ€rnan som orsakar oförutsĂ€gbara förseningar.
  • Du mĂ„ste vara uppmĂ€rksam pĂ„ saker som CPU-affinitet, Interrupt-affinitet, NUMA.

Det mÄste sÀgas att Àmnet hÄrdvaru- och kÀrninstÀllningar Linux Realtidsbehandling förtjÀnar en separat artikel. Vi lade ner mycket tid pÄ att experimentera och undersöka innan vi uppnÄdde ett bra resultat.

NÀr vi flyttade frÄn PA-RISC-servrar till x86 behövde vi praktiskt taget inte Àndra systemkoden mycket, vi bara anpassade och konfigurerade om den. Samtidigt fixade vi flera buggar. Till exempel kom konsekvenserna av det faktum att PA RISC var ett Big endian-system och x86 var ett Little endian-system snabbt upp: data lÀstes till exempel felaktigt. Det svÄrare felet var att PA RISC anvÀnder konsekvent konsekvent (Sekvensiellt konsekvent) minnesÄtkomst, medan x86 kan ordna om lÀsoperationer, sÄ kod som var absolut giltig pÄ en plattform blev trasig pÄ en annan.

Efter byte till x86 ökade prestandan nĂ€stan tre gĂ„nger, den genomsnittliga transaktionsbehandlingstiden minskade till 60 ÎŒs.

LÄt oss nu titta nÀrmare pÄ vilka viktiga förÀndringar som har gjorts i systemarkitekturen.

Hett reservepos

NÀr vi bytte till rÄvaruservrar var vi medvetna om att de var mindre tillförlitliga. DÀrför, nÀr vi skapade en ny arkitektur, antog vi a priori möjligheten av fel pÄ en eller flera noder. DÀrför behövdes ett hot standby-system som mycket snabbt kunde byta till reservmaskiner.

Dessutom fanns det andra krav:

  • Under inga omstĂ€ndigheter fĂ„r du förlora bearbetade transaktioner.
  • Systemet mĂ„ste vara helt transparent för vĂ„r infrastruktur.
  • Klienter ska inte se avbrutna anslutningar.
  • Reservationer bör inte medföra betydande förseningar eftersom detta Ă€r en kritisk faktor för utbytet.

NÀr vi skapade ett hot standby-system övervÀgde vi inte sÄdana scenarier som dubbla fel (till exempel slutade nÀtverket pÄ en server att fungera och huvudservern frös); övervÀgde inte möjligheten av fel i programvaran eftersom de identifieras under testning; och tog inte hÀnsyn till den felaktiga driften av hÄrdvaran.

Som ett resultat kom vi till följande schema:

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

  • Huvudservern interagerade direkt med Gateway-servrarna.
  • Alla transaktioner som togs emot pĂ„ huvudservern replikerades omedelbart till backupservern via en separat kanal. Skiljemannen (guvernören) samordnade bytet om nĂ„gra problem uppstod.

    Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

  • Huvudservern behandlade varje transaktion och vĂ€ntade pĂ„ bekrĂ€ftelse frĂ„n backupservern. För att hĂ„lla latensen till ett minimum undvek vi att vĂ€nta pĂ„ att transaktionen skulle slutföras pĂ„ backupservern. Eftersom tiden det tog för en transaktion att fĂ€rdas över nĂ€tverket var jĂ€mförbar med exekveringstiden, lades ingen ytterligare latens till.
  • Vi kunde bara kontrollera bearbetningsstatusen för huvud- och reservservrarna för den föregĂ„ende transaktionen, och bearbetningsstatusen för den aktuella transaktionen var okĂ€nd. Eftersom vi fortfarande anvĂ€nde entrĂ„dade processer, skulle vĂ€nta pĂ„ svar frĂ„n Backup ha saktat ner hela bearbetningsflödet, sĂ„ vi gjorde en rimlig kompromiss: vi kontrollerade resultatet av den föregĂ„ende transaktionen.

Utveckling av arkitekturen för handels- och clearingsystemet för Moskvabörsen. Del 1

Schemat fungerade enligt följande.

LÄt oss sÀga att huvudservern slutar svara, men Gateways fortsÀtter att kommunicera. En timeout intrÀffar pÄ backupservern, den kontaktar guvernören, som tilldelar den rollen som huvudserver, och alla Gateways byter till den nya huvudservern.

Om huvudservern kommer tillbaka online utlöser den ocksÄ en intern timeout, eftersom det inte har varit nÄgra anrop till servern frÄn Gatewayen under en viss tid. Sedan vÀnder han sig ocksÄ till guvernören, och han utesluter honom frÄn schemat. Som ett resultat fungerar utbytet med en server till slutet av handelsperioden. Eftersom sannolikheten för ett serverfel Àr ganska lÄg ansÄgs detta schema vara ganska acceptabelt, det innehöll ingen komplex logik och var lÀtt att testa.

Att fortsÀtta

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster