紧凑的尾部。 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 是我们构建的三个引擎之一。同一套理念:能开源的就开源,性能优先,无锁定。