Une interface conversationnelle pour l'architecture, les dictionnaires de messages, les profils de venue et la suite de benchmarks de NexusFIX. 182 questions répondues par des experts indexées et ancrées dans la base de code live. Et un fil en direct quand la réponse préformatée ne suffit pas.
Bonjour, je suis l'expert NexusFIX, ancré dans le code source public, les CSV de benchmark et les 182 réponses sélectionnées indexées sur cette page.
Choisissez un fil à droite, ou demandez-moi n'importe quoi ci-dessous. Si la réponse n'est pas dans la source, je le dirai.
Comment NexusFIX atteint-il zéro allocation heap ?
Trois substitutions, toutes sur le chemin chaud :
1. Les vues std::span<const char> dans le buffer d'origine remplacent les copies std::string. Le span fait 16 octets sur la pile. Pas de heap, pas de copie, pas de destructeur.
2. Un tableau pré-indexé remplace std::map pour la recherche de champ. L'accès au champ devient un seul mov indexé par numéro de tag FIX.
3. std::pmr::monotonic_buffer_resource fournit l'allocation arena pour tout ce qui a vraiment besoin d'un slot. L'arena est pré-dimensionnée et réutilisée par session.
Le résultat : 0 appel malloc sur le chemin chaud, vérifié via un allocateur personnalisé qui instrumente chaque alloc/free et fait échouer le test si l'un d'eux se déclenche.
Les huit questions qui reviennent dans presque chaque conversation. Cliquez pour développer. Ou ramenez-la dans le fil live ci-dessus.
QuickFIX a été conçu au début des années 2000 autour des idiomes C++98/03 : dispatch virtuel, allocation heap par message, stockage de champ basé sur des chaînes. Ces patterns sont fondamentalement incompatibles avec une latence sub-microseconde.
Nous avons recommencé à partir des premiers principes en utilisant les capacités C++23 qui n'existaient pas lors de la conception de QuickFIX. Std::span, std::expected, std::pmr, concepts et consteval. Et nous nous sommes demandé : à quoi ressemblerait un moteur FIX si on ne portait pas vingt ans de décisions d'allocateur ?
Sociétés de trading quantitatif et équipes d'infrastructure qui ont besoin d'un traitement déterministe et sub-microseconde des messages FIX.
Plus précisément : sociétés exploitant des stratégies co-localisées, équipes construisant des passerelles de trading personnalisées, et ingénieurs C++ étudiant des techniques de performance modernes sur une vraie base de code publique.
Les vues std::span
Le résultat : zéro appel malloc sur le chemin chaud, vérifié via un harnais d'instrumentation d'allocateur personnalisé qui s'exécute à chaque build CI.
std::expected pour la gestion d'erreurs (pas d'exceptions sur le chemin chaud), std::span pour les vues de données zéro-copie, concepts pour la validation d'interface à la compilation, consteval pour le calcul à la compilation, et les hints de branche [[likely]]/[[unlikely]].
Chacune d'elles aurait nécessité une implémentation personnalisée à l'époque de QuickFIX.
Les instructions AVX2 chargent 32 octets à la fois et utilisent la comparaison vectorisée pour trouver les délimiteurs SOH (\x01) en parallèle. C'est ~13× plus rapide que le scan octet par octet.
La technique est inspirée de simdjson mais adaptée à la sémantique du protocole FIX. La structure tag=value=SOH signifie qu'on peut localiser chaque limite de champ en une seule passe vectorisée puis construire la table des offsets.
FIX 4.4 est entièrement supporté et est le plus courant en production. FIX 5.0 + FIXT 1.1 est aussi entièrement supporté avec seulement 2% de surcoût par rapport à 4.4.
L'index structurel est agnostique de la version. Le scan de champ fonctionne de manière identique entre versions FIX. Les overlays de dialecte personnalisés gèrent les tags spécifiques aux venues lors du bind de session.
NexusFIX est en développement actif et n'a pas encore été déployé dans des environnements de trading en production. Les benchmarks proviennent d'environnements contrôlés avec pinning CPU et préchauffage du cache.
Le durcissement production. Tests de soak, couverture des modes de défaillance, certification contre des passerelles de venue spécifiques. Est un effort d'ingénierie distinct. Si vous l'envisagez pour la prod, parlez-nous d'abord.
Fix8 (C++11) utilise des pools d'objets et des techniques zéro-copie, et est l'un des moteurs FIX open source plus sophistiqués.
NexusFIX se différencie en exploitant les fonctionnalités de la bibliothèque standard C++23 (PMR, std::span, std::expected) au lieu d'implémentations personnalisées. Moins de pièces mobiles à auditer. Et en ajoutant le parsing accéléré par SIMD, que Fix8 n'a pas.
Posez-la dans le fil live ci-dessus. Ou ouvrez un issue sur GitHub. Chaque question qui obtient une réponse sourcée et utile rejoint le jeu indexé à la prochaine version.