FIX プロトコルエンジン · v1.8 · 2026 年 5 月

NexusFIX。
決してアロケートしないエンジン。

ハートビートの欠落を許さない取引所のために構築された C++23 FIX プロトコルエンジン。ホットパスでのゼロアロケーション、サブマイクロ秒のパース、決定論的なセッション状態。
予測可能。 隅々まで。

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

メッセージストリーム · 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
メッセージスループット
0
ホットパスのヒープアロケーション
412ns
p99 パース遅延
3.4×
QuickFIX ベースライン比

パフォーマンス 予算。

本番ランブックで参照するすべての数値。負荷下でコモディティハードウェアを用い、決定論的なリプレイで測定。

パース遅延
<500ns
p99、NewOrderSingle。固定バッファ、ゼロコピーのフィールド反復。
スループット
240K+ /s
セッションごと、シングルコア。複数セッションで線形スケール。
ホットパスのアロケーション
0
静的 arena、サイズ事前確保のリングバッファ、インプレースデコード。
QuickFIX 比
3×
同一ワークロードでエンドツーエンドにより高速。再現可能なベンチマークスイート。

運用者が
NexusFIX を選ぶ理由。

相乗する 3 つのアーキテクチャ選択。それぞれが次のものを可能にする。

1 レイヤー 1 · 決定論

タイトなテール。 p99 でサプライズなし。

ロックフリー SPSC キュー、分岐なしのタグデコーダ、ホットパスのインライン化。最も遅いメッセージが最も速いものと同じに見える。それこそが取引所が実際に評価する指標。

120nsp50 · 240nsp90 · 360nsp99 · 412nsp99.9 · 580ns
2 レイヤー 2 · メモリ

ゼロアロケーション ホットパス上で。

静的 arena、侵入型フリーリスト、固定サイズのメッセージスロット。注文が流れている間、アロケータは動かない。だからカーネルがページ回収のためにあなたをプリエンプトすることもない。

QuickFIX /order-flow
ヒープアロケーション / メッセージ~14
NexusFIX /order-flow
ヒープアロケーション / メッセージ0 · arena 再利用
3 レイヤー 3 · プロトコル

FIX 4.2 / 4.4 / 5.0 / FIXT。 1 つのエンジン。

バージョンごとに生成された辞書、セッション単位で実行時に選択可能。取引所固有フィールド用のカスタム方言オーバーレイ。取引所が動かしているワイヤフォーマットがあなたが送るフォーマット。

FIX 4.2フル
FIX 4.4フル
FIX 5.0 SP2フル
FIXT 1.1フル
カスタムオーバーレイ
本番回線で実戦テスト済み

あなたが実際に取引する取引所向けに 設定済み。

主要な株式・先物・FX・暗号通貨取引所向けのセッションプロファイルを事前構築。本番トレースから捕捉したハートビート、シーケンスリセットのセマンティクス、再送リクエストのクセを含む。

CMEICENYSENasdaqLSEEurexHKEXSGXEBSRefinitivCoinbase PrimeBinance Inst.

ホットパス、
二つの方法。

同じ NewOrderSingle のデコード&ルーティングを並べて。同じメッセージ、同じマシン、まったく異なるコスト。

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 パース + ルート1.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 パース + ルート412 ns · 0 allocs

なぜチームは置き換えるのか QuickFIX を。

QuickFIX は業界の重労働を 20 年にわたり担ってきました。NexusFIX は、その当時の選択がボトルネックになったときに手に取るものです。

QuickFIXNexusFIX
ホットパスのアロケーション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 なし
QuickFIX が作られた頃、5,000 msg/sec は忙しいセッションでした。NexusFIX は、それが「静かな 1 分」と呼ばれる現場のために作られています。 そしてテールはどのみち平らに保たなければなりません。

ホットパスを、
端から端まで。

ワイヤ上のバイトが入り、ルーティング済みの注文が出る。3 つのステージ、すべて同じスレッドで、すべてアロケートせずに。

1 ステージ 1 · デコード

バイトを入れて、フィールドを出す。 コピーなしで。

SOH 区切りのストリームをインプレースで走査。各タグは元バッファ上の型付きビューに解決され、数値フィールドは分岐なしでパースされ、方言オーバーレイはセッションバインド時に適用されます。

span<const char>分岐なしSIMD チェックサム
2 ステージ 2 · 検証

セッション状態を、 決定論的に。

シーケンス番号、ハートビート窓、gap-fill のセマンティクス、resend-request の癖。venue プロファイルごとに生成されたステートマシンが処理し、すべての遷移が memory-mapped ジャーナルに記録されます。

seq-numハートビート再送mmap journal
3 ステージ 3 · ルート

あなたのハンドラへ、 ゼロアロケーションで。

固定アリーナのオーダースロットを取得し、参照で詰めて、ロックフリー SPSC キュー経由でアプリケーションに渡します。スロットは注文が終端状態に達するまで生き、その後アリーナに返却されます。

SPSC キューアリーナスロットvirtual なし

さらに 深く。

次に引っ張れる糸が二本あります。アーキテクチャ深掘り記事、あるいはライブな対話型解説。

半日で 繋ぎ込める。

NexusFIX は単一の静的ライブラリと CLI セッションシミュレーターとして提供されます。venue 設定とハンドラを持ってくれば、ローカルで決定論的な FIX セッションが動きます。ジャーナルから再生でき、バイト単位までトレース可能です。

他の プロジェクト。

NexusFIX は私たちが作る 3 つのエンジンのうちの一つです。同じ哲学:可能な限りオープンソース、パフォーマンス第一、ロックインなし。