緊湊的尾部。 p99 無意外。
無鎖 SPSC 佇列、無分支標籤解碼器、熱路徑內聯。最慢的訊息看起來和最快的一樣。這才是交易場所真正考核你的指標。
專為不容許心跳遺失的交易場所打造的 C++23 FIX 協定引擎。熱路徑零配置、亞微秒級解析、確定性會話狀態。
可預測。 一路貫穿。
生產手冊裡你會查找的每一個數字。負載下測量,使用通用硬體,基於確定性重播。
三個架構選擇層層疊加。每一個都讓下一個成為可能。
無鎖 SPSC 佇列、無分支標籤解碼器、熱路徑內聯。最慢的訊息看起來和最快的一樣。這才是交易場所真正考核你的指標。
靜態 arena、侵入式空閒清單、固定大小訊息槽。當訂單流動時配置器從不執行。所以核心也從不會為回收頁面而搶佔你。
為每個版本產生字典,工作階段層級執行時可選。為交易場所特定欄位提供自訂方言覆蓋層。交易場所執行的線路格式就是你傳送的格式。
為主要的股票、期貨、外匯和加密貨幣場所預先建置工作階段設定檔。從真實生產追蹤中擷取的心跳、序列重置語意和重傳請求特殊處理。
同一筆 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 為整個產業扛起了二十年的重活。當那些早期取捨變成瓶頸時,你就會轉向 NexusFIX。
| QuickFIX | NexusFIX | |
|---|---|---|
| 熱路徑分配 | 每筆訊息約 14 次堆分配(std::string、Decimal) | 0 · 靜態 arena,原地解碼 |
| 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 |
線纜位元組進來,路由訂單出去。三個階段,全部跑在同一執行緒,全部不做分配。
以 SOH 分隔的位元組流原地迭代。每個 tag 都解析成對原始緩衝區的型別化視圖;數值欄位以無分支方式解析,方言疊加在會話綁定時套用。
序列號、心跳視窗、gap-fill 語意、resend-request 怪癖。由按 venue 設定產生的狀態機處理,每條轉移都寫入 memory-mapped 日誌。
從固定 arena 取得一個訂單槽位,透過參考填入,再透過無鎖 SPSC 佇列交給你的應用程式。槽位一直存活到訂單進入終態,隨後歸還 arena。
接下來可以走的兩條線:架構深度文章,或可對話的即時講解器。
NexusFIX 是我們建構的三個引擎之一。同一套理念:能開源的就開源,效能優先,無鎖定。