Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Loop hjälp C#
Visa signatur
Visa signatur
Jag byggde ett Högfrekvenshandelsystem till en kund för ett tag sedan så kallad bothandel. Kravet var 2 000 000 transaktioner i sekunden. Vi klarade det i benchmark med några extra 100k i .NET. Googla Starcounter....
Men det är en helt annan typ av arbetslast. Typiskt i HFT system så har man <---> TCP -- server -- UDP/Mcast -->
D.v.s. man har relativt få TCP koppel, men framförallt så är det etablerade koppel.
En ganska naiv implementation av detta på Linux ger 1.5M transaktioner per sekund på en gammal Westmere baserad Xeon (med Sandy Bridge som har DDIO får man typiskt en prestandaförbättring på >50%), 4 kärnor 2.4GHz och med ett lite mer specialanpassat system (det som jag beskrev ovan) så når man över 5M transaktioner per sekund, men en genomsnittlig latens på strax under <1µs (FPGA:er kommer ner till 100ns, så det är en bit kvar till det). Och det var med ganska standard Intel NICs, antar att om du höll på med HFT så använde ni svindyra Mellanox eller Solarflare NIC:ar.
Fallet jag beskrev ovan höll dels tiotusentals samtida koppel "in-flight" + att varje transaktion består rent logiskt av
accept() // acceptera klient
recv() // HTTP från klient
connect() // simulera "kall" databas-koppling
send() + recv() // skicka/ta emot från "databas"
close() // stäng databas koppel
// skapa svar
send() // HTTP svar till klient
recv() // kommer läsa EOF då klienten kopplat ner
close()
Hur kan jag skriva något i .Net som dels hanterar tiotusentals samtida sådana sessioner + att hantera 100k sådana transaktioner per sekund?
Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer
Ganska likt interaktionsdiagrammet för systemet jag beskrev ovan, vi körde dock inte HTTP utan binärt för att slippa overhead.
Cirka 2.5m ggr per sekund får vi börsdata via UDP, slår upp de kunder och portföljer som berörs från Starcounter, applicerar köp/säljregler och sedan om det krävs skickar vi ett svar via TCP, går allt bra spar vi ner transaktionen i Starcounter. Efter som det är ett finanssystem krävdes det även att vi körde i den striktaste av Transaktionsscope, vilket Starcounter fixar galant.
Du tänker nog på ramverk som MVC, MVC använder reflection för att kringgå att MSIL inte är dynamiskt (Som tex javascript eller Ruby). Reflection är segt och det är en enorm flaskhals för denna mängd av transaktioner per sekund. Dock är det välldigt sällan en kund kräver dessa frekvenser.
Oftast är det andra parametrar som maintainability och stability som är nyckeltal i ett IT-system och där fungerar .NET väldigt bra. Jag sitter just nu på ett system där jag varit ansvarig för hela arkitekturen. Med en Backend i C# och sedan en clientside frontend skrivet i KnockoutJS. Tack vare BDD och TDD (Även på Javascripten) har vi haft 0 allvarliga buggar och en eller två buggar som går att kringå.
Spelnyheter från FZ
Copyright © 1999–2025 Geeks AB. Allt innehåll tillhör Geeks AB.
Citering är tillåten om källan anges.