タイトなテール。 p99 でサプライズなし。
ロックフリー SPSC キュー、分岐なしのタグデコーダ、ホットパスのインライン化。最も遅いメッセージが最も速いものと同じに見える。それこそが取引所が実際に評価する指標。
ハートビートの欠落を許さない取引所のために構築された C++23 FIX プロトコルエンジン。ホットパスでのゼロアロケーション、サブマイクロ秒のパース、決定論的なセッション状態。
予測可能。 隅々まで。
本番ランブックで参照するすべての数値。負荷下でコモディティハードウェアを用い、決定論的なリプレイで測定。
相乗する 3 つのアーキテクチャ選択。それぞれが次のものを可能にする。
ロックフリー SPSC キュー、分岐なしのタグデコーダ、ホットパスのインライン化。最も遅いメッセージが最も速いものと同じに見える。それこそが取引所が実際に評価する指標。
静的 arena、侵入型フリーリスト、固定サイズのメッセージスロット。注文が流れている間、アロケータは動かない。だからカーネルがページ回収のためにあなたをプリエンプトすることもない。
バージョンごとに生成された辞書、セッション単位で実行時に選択可能。取引所固有フィールド用のカスタム方言オーバーレイ。取引所が動かしているワイヤフォーマットがあなたが送るフォーマット。
主要な株式・先物・FX・暗号通貨取引所向けのセッションプロファイルを事前構築。本番トレースから捕捉したハートビート、シーケンスリセットのセマンティクス、再送リクエストのクセを含む。
同じ NewOrderSingle のデコード&ルーティングを並べて。同じメッセージ、同じマシン、まったく異なるコスト。
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
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 }
QuickFIX は業界の重労働を 20 年にわたり担ってきました。NexusFIX は、その当時の選択がボトルネックになったときに手に取るものです。
| QuickFIX | NexusFIX | |
|---|---|---|
| ホットパスのアロケーション | 1 メッセージあたり ~14 回のヒープアロケーション(std::string、Decimal) | 0 · 静的アリーナ、インプレースデコード |
| p99 パース遅延 | 方言によって 1.2–1.8 µs | < 500 ns · 分岐なしタグデコード |
| スループット / コア | 60–90K msg/s を持続 | 240K+ msg/s 持続 |
| 負荷時のテール挙動 | GC なしだが、アロケータのチャーン = 予測不能なスパイク | ホットパスにアロケータなし。 フラットなテール |
| プロトコルバージョン | 4.2 / 4.4 / 5.0。ビルド毎の XML データ辞書 | 4.2 / 4.4 / 5.0 / FIXT + ランタイム方言オーバーレイ |
| 言語 | C++03 / C++11 のイディオム、仮想ディスパッチ | C++23, concepts + ranges、ホットパスに virtual なし |
ワイヤ上のバイトが入り、ルーティング済みの注文が出る。3 つのステージ、すべて同じスレッドで、すべてアロケートせずに。
SOH 区切りのストリームをインプレースで走査。各タグは元バッファ上の型付きビューに解決され、数値フィールドは分岐なしでパースされ、方言オーバーレイはセッションバインド時に適用されます。
シーケンス番号、ハートビート窓、gap-fill のセマンティクス、resend-request の癖。venue プロファイルごとに生成されたステートマシンが処理し、すべての遷移が memory-mapped ジャーナルに記録されます。
固定アリーナのオーダースロットを取得し、参照で詰めて、ロックフリー SPSC キュー経由でアプリケーションに渡します。スロットは注文が終端状態に達するまで生き、その後アリーナに返却されます。
次に引っ張れる糸が二本あります。アーキテクチャ深掘り記事、あるいはライブな対話型解説。
NexusFIX は単一の静的ライブラリと CLI セッションシミュレーターとして提供されます。venue 設定とハンドラを持ってくれば、ローカルで決定論的な FIX セッションが動きます。ジャーナルから再生でき、バイト単位までトレース可能です。
NexusFIX は私たちが作る 3 つのエンジンのうちの一つです。同じ哲学:可能な限りオープンソース、パフォーマンス第一、ロックインなし。