FIX Protokol Motoru · v1.8 · Mayıs 2026

NexusFIX.
Asla bellek ayırmayan bir motor.

Kaçırılan bir heartbeat'i affetmeyen borsalar için tasarlanmış bir C++23 FIX protokol motoru. Sıcak yolda sıfır bellek ayırma, mikrosaniyenin altında parse, deterministik oturum durumu.
Öngörülebilir. En ince ayrıntısına dek.

nexusfix / session / XCME.PROD.42
C++23 · 0 ALLOC · 247K msg/s

Mesaj akışı · XCME.PROD.42 · NewOrderSingle ⇄ ExecutionReport

tail -f · live stream
12:04:18.11435=D|49=NEXFIX|56=XCME|34=184221|11=ord-9f2e|55=ESM6|54=1|38=2|40=2|44=5418.25parsed 318 ns
12:04:18.11435=8|49=XCME|56=NEXFIX|34=184222|11=ord-9f2e|17=exec-1|150=0|39=0|55=ESM6|54=1acked 1.2 µs
12:04:18.47135=8|49=XCME|56=NEXFIX|34=184223|11=ord-9f2e|17=exec-2|150=F|39=2|32=2|31=5418.25parsed 296 ns
12:04:19.00035=0 heartbeat|34=184224|49=NEXFIX|56=XCME · 30s intervalsent 84 ns
12:04:19.21435=D|49=NEXFIX|56=XCME|34=184225|11=ord-9f2f|55=NQM6|54=2|38=1|40=2|44=19842.75parsed 304 ns
12:04:19.21535=8|49=XCME|56=NEXFIX|34=184226|11=ord-9f2f|17=exec-3|150=0|39=0acked 1.1 µs
12:04:19.60135=8|49=XCME|56=NEXFIX|34=184227|11=ord-9f2f|17=exec-4|150=F|39=2|32=1|31=19842.50parsed 311 ns
12:04:19.88035=F CancelRequest|34=184228|41=ord-9f2e|11=cxl-7a01|55=ESM6parsed 292 ns
12:04:19.88135=8|49=XCME|56=NEXFIX|34=184229|11=cxl-7a01|17=exec-5|150=4|39=4 · cancelledacked 1.0 µs
247K/s
mesaj verimi
0
sıcak yolda heap ayırma
412ns
p99 parse gecikmesi
3.4×
QuickFIX referansına karşı

Performans bütçesi.

Bir prodüksiyon runbook'unda arayacağınız her sayı. Yük altında, standart donanımda, deterministik bir tekrar oynatımına karşı ölçüldü.

Parse gecikmesi
<500ns
p99, NewOrderSingle. Sabit tamponlar, sıfır kopya alan yinelemesi.
Verim
240K+ /s
Oturum başına, tek çekirdek. Oturumlar arasında doğrusal ölçeklenme.
Sıcak yol ayırmaları
0
Statik arena, önceden boyutlandırılmış halka tamponlar, yerinde kod çözme.
QuickFIX'e karşı
3×
Aynı iş yükünde uçtan uca daha hızlı. Yeniden üretilebilir karşılaştırma paketi.

Operatörlerin
NexusFIX'i seçme nedeni.

Birbiri üzerine eklenen üç mimari tercih. Her biri bir sonrakini mümkün kılıyor.

1 Katman 1 · Determinizm

Sıkı kuyruk. p99'da sürpriz yok.

Kilitsiz SPSC kuyrukları, dallanmasız etiket çözücüleri, sıcak yol inline'lama. En yavaş mesaj en hızlısına benziyor. Borsaların sizi gerçekten değerlendirdiği ölçüt budur.

120nsp50 · 240nsp90 · 360nsp99 · 412nsp99.9 · 580ns
2 Katman 2 · Bellek

Sıfır bellek ayırma sıcak yolda.

Statik arena, intrüziv freelist'ler, sabit boyutlu mesaj yuvaları. Emirler akarken ayırıcı asla çalışmaz. Bu yüzden çekirdek sayfayı geri almak için sizi asla araya almaz.

QuickFIX /order-flow
heap ayırma / msj~14
NexusFIX /order-flow
heap ayırma / msj0 · arena yeniden kullanımı
3 Katman 3 · Protokol

FIX 4.2 / 4.4 / 5.0 / FIXT. Tek motor.

Her sürüm için üretilmiş sözlükler, oturum başına çalışma zamanında seçilebilir. Borsaya özgü alanlar için özel lehçe katmanları. Borsanın çalıştırdığı tel formatı, sizin gönderdiğiniz formattır.

FIX 4.2tam
FIX 4.4tam
FIX 5.0 SP2tam
FIXT 1.1tam
Özelkatman
Telde sahada test edildi

Gerçekten işlem yaptığınız borsalar için yapılandırıldı.

Başlıca hisse senedi, vadeli işlem, FX ve kripto borsaları için önceden hazırlanmış oturum profilleri. Gerçek üretim izlerinden yakalanan heartbeat, sequence-reset semantiği ve resend-request tuhaflıkları.

CMEICENYSENasdaqLSEEurexHKEXSGXEBSRefinitivCoinbase PrimeBinance Inst.

Sıcak yol,
iki türlü.

Bir NewOrderSingle'ın decode ve yönlendirmesi, yan yana. Aynı mesaj, aynı makine, çok farklı maliyet.

QuickFIX (C++) application.cpp
void Application::onMessage(const FIX44::NewOrderSingle& msg, const SessionID& sid)
{
  FIX::ClOrdID    clOrdId;   msg.get(clOrdId);       // allocates
  FIX::Symbol     symbol;    msg.get(symbol);        // allocates
  FIX::Side       side;      msg.get(side);
  FIX::OrderQty   qty;       msg.get(qty);           // allocates Decimal
  FIX::Price      price;     msg.get(price);         // allocates Decimal

  std::string key = symbol.getString();          // allocates std::string
  router_->route(key, clOrdId.getString(), qty, price);
}                                                // ~14 heap allocs / msg
p99 parse + route1.42 µs · 14 allocs
NexusFIX (C++23) order_handler.cpp
void OrderHandler::on_message(MessageView m, SessionRef sid) noexcept
{
  auto [cl_ord_id, symbol, side, qty, price] =
      m.decode<D::ClOrdID, D::Symbol, D::Side,
                D::OrderQty, D::Price>();     // in-place, span<const char>

  // fixed-arena order slot, no heap, no copies
  auto& slot = arena_.acquire(cl_ord_id);
  slot.init(symbol, side, qty, price, sid);

  router_.route(slot);                              // 0 heap allocs / msg
}
p99 parse + route412 ns · 0 allocs

Ekipler neden değiştiriyor: QuickFIX.

QuickFIX iki on yıl boyunca sektörün ağır yükünü taşıdı. O eski tercihler darboğaza dönüştüğünde NexusFIX'e başvurulur.

QuickFIXNexusFIX
Sıcak yol ayırmalarıMesaj başına ~14 heap ayırma (std::string, Decimal)0 · statik arenalar, yerinde decode
p99 parse gecikmesiLehçeye göre 1,2–1,8 µs< 500 ns · dalsız etiket decode'u
Çekirdek başına debi60–90K msg/s sürdürülebilir240K+ msg/s sürdürülebilir
Yük altında kuyruk davranışıGC yok, ama allocator çalkantısı = öngörülemez sıçramalarSıcak yolda allocator yok. düz kuyruk
Protokol sürümleri4.2 / 4.4 / 5.0. Yapı başına XML veri sözlüğü4.2 / 4.4 / 5.0 / FIXT + çalışma zamanı lehçe katmanı
DilC++03 / C++11 deyimleri, sanal dispatchC++23, concepts + ranges, sıcak yolda virtual yok
QuickFIX, 5.000 msg/sn'nin yoğun bir oturum sayıldığı zamanlarda yapıldı. NexusFIX, bunun «sakin bir dakika» olduğu venue'ler için yapıldı. ve kuyruk yine de düz kalmalı.

Sıcak yol,
uçtan uca.

Tel üzerinden bayt girer. Yönlendirilmiş emir çıkar. Üç aşama, hepsi aynı iş parçacığında, hepsi bellek ayırmadan.

1 Aşama 1 · Decode

Baytlar içeri, alanlar dışarı. kopyasız.

SOH ile ayrılmış akış yerinde dolaşılır. Her etiket, orijinal tampon üzerinde tipli bir görünüme çözülür; sayısal alanlar dalsız olarak parse edilir, lehçe katmanı oturum bağlama anında uygulanır.

span<const char>dalsızSIMD sağlama
2 Aşama 2 · Doğrulama

Oturum durumu, deterministik olarak.

Sıra numaraları, heartbeat pencereleri, gap-fill semantiği, resend-request tuhaflıkları. Her venue profili için üretilen bir durum makinesi tarafından işlenir. Her geçiş memory-mapped bir günlüğe yazılır.

seq-numheartbeatresendmmap journal
3 Aşama 3 · Yönlendirme

Handler'ınıza, sıfır ayırma.

Sabit bir arenadaki bir emir slotu alınır, referansla doldurulur ve lock-free SPSC kuyruğu üzerinden uygulamanıza teslim edilir. Slot, emir terminal durumuna ulaşana kadar yaşar, ardından arenaya geri döner.

SPSC kuyruğuarena slotuvirtual yok

Daha derine.

Sırada çekilecek iki iplik daha. Mimari yazısı veya canlı sohbet edilebilir açıklayıcı.

Bir öğleden sonra bağlayın.

NexusFIX, tek bir statik kütüphane ve CLI oturum simülatörü olarak gönderilir. Bir venue yapılandırması ve bir handler getirin, yerelde çalışan deterministik bir FIX oturumunuz olsun. Bir günlükten yeniden oynatılabilir, bayta kadar izlenebilir.

Diğer projeleri keşfedin.

NexusFIX, inşa ettiğimiz üç motordan biri. Aynı felsefe: mümkün olduğunda open-source, performans önce, lock-in yok.