Un'interfaccia conversazionale per l'architettura, i dizionari dei messaggi, i profili delle venue e la suite di benchmark di NexusFIX. 182 domande risposte da esperti indicizzate e ancorate alla base di codice live. E un thread live quando la risposta preconfezionata non basta.
Ciao, sono l'esperto NexusFIX, ancorato al sorgente pubblico, ai CSV di benchmark e alle 182 risposte selezionate indicizzate in questa pagina.
Scegli un thread a destra, o chiedimi qualsiasi cosa sotto. Se la risposta non è nel sorgente, lo dirò.
Come fa NexusFIX a raggiungere zero allocazioni heap?
Tre sostituzioni, tutte sull'hot path:
1. Le view std::span<const char> sul buffer originale sostituiscono le copie std::string. Lo span occupa 16 byte sullo stack. Nessun heap, nessuna copia, nessun distruttore.
2. Un array pre-indicizzato sostituisce std::map per la ricerca dei campi. L'accesso ai campi diventa un singolo mov indicizzato dal numero di tag FIX.
3. std::pmr::monotonic_buffer_resource fornisce allocazione arena per ciò che ha effettivamente bisogno di uno slot. L'arena è pre-dimensionata e riutilizzata per sessione.
Il risultato: 0 chiamate malloc sull'hot path, verificato tramite un allocatore custom che strumenta ogni alloc/free e fa fallire il test se una scatta.
Le otto domande che emergono in quasi ogni conversazione. Clicca per espandere. O riportala nel thread live sopra.
QuickFIX è stato progettato all'inizio degli anni 2000 attorno a idiomi C++98/03: dispatch virtuale, allocazione heap per messaggio, storage di campo basato su stringhe. Questi pattern sono fondamentalmente incompatibili con latenza sub-microsecondo.
Siamo ripartiti dai primi principi usando funzionalità C++23 che non esistevano quando QuickFIX fu progettato. Std::span, std::expected, std::pmr, concetti e consteval. E ci siamo chiesti: come sarebbe un motore FIX se non ci si portasse dietro vent'anni di decisioni di allocatore?
Aziende di trading quantitativo e team di infrastruttura che necessitano di elaborazione FIX deterministica e sub-microsecondo.
Nello specifico: aziende che eseguono strategie co-localizzate, team che costruiscono gateway di trading personalizzati, e ingegneri C++ che studiano tecniche di performance moderne su un codebase reale e pubblico.
Le view std::span
Il risultato: zero chiamate malloc sull'hot path, verificato tramite un harness di strumentazione di allocatore custom che gira ad ogni build CI.
std::expected per la gestione errori (nessuna eccezione sull'hot path), std::span per view dati zero-copy, concetti per validazione interfaccia a compile-time, consteval per computazione a compile-time, e hint di branch [[likely]]/[[unlikely]].
Ogni una di queste avrebbe richiesto un'implementazione custom nell'era di QuickFIX.
Le istruzioni AVX2 caricano 32 byte alla volta e usano confronto vettorizzato per trovare delimitatori SOH (\x01) in parallelo. È ~13× più veloce dello scan byte per byte.
La tecnica è ispirata a simdjson ma adattata alla semantica del protocollo FIX. Ovvero, la struttura tag=value=SOH significa che possiamo localizzare ogni confine di campo in un singolo passaggio vettorizzato e poi costruire la tabella offset.
FIX 4.4 è pienamente supportato ed è il più comune in produzione. FIX 5.0 + FIXT 1.1 è anch'esso pienamente supportato con solo il 2% di overhead rispetto al 4.4.
L'indice strutturale è agnostico alla versione. Lo scan dei campi funziona in modo identico tra le versioni FIX. Gli overlay di dialetto custom gestiscono i tag specifici del venue al bind della sessione.
NexusFIX è in sviluppo attivo e non è ancora stato deployato in ambienti di trading produttivi. I benchmark provengono da ambienti controllati con pinning CPU e riscaldamento cache.
Irrobustimento produzione. Soak test, copertura modalità di guasto, certificazione contro gateway di venue specifici. È uno sforzo ingegneristico separato. Se lo stai considerando per la prod, parlaci prima.
Fix8 (C++11) usa pool di oggetti e tecniche zero-copy ed è uno dei motori FIX open source più sofisticati.
NexusFIX si differenzia sfruttando le funzionalità della libreria standard C++23 (PMR, std::span, std::expected) invece di implementazioni custom. Meno parti mobili da auditare. E aggiungendo il parsing accelerato da SIMD che Fix8 non ha.
Chiedila nel thread live sopra. O apri una issue su GitHub. Ogni domanda con una risposta sourced e utile entra nel set indicizzato nella prossima release.