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。

三个架构选择层层叠加。每一个都让下一个成为可能。

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。 一个引擎。

为每个版本生成字典,会话级运行时可选。为交易场所特定字段提供自定义方言覆盖层。交易场所运行的线路格式就是你发送的格式。

FIX 4.2完整
FIX 4.4完整
FIX 5.0 SP2完整
FIXT 1.1完整
自定义覆盖层
线上久经实战考验

为你真正交易的场所 量身配置。

为主要的股票、期货、外汇和加密货币场所预构建会话配置文件。从真实生产追踪中捕获的心跳、序列重置语义和重传请求特殊处理。

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 为整个行业扛起了二十年的重活。当那些早期取舍变成瓶颈时,你就会转向 NexusFIX。

QuickFIXNexusFIX
热路径分配每条消息约 14 次堆分配(std::string、Decimal)0 · 静态 arena,原地解码
p99 解析延迟依方言不同 1.2–1.8 µs< 500 ns · 无分支标签解码
吞吐 / 核持续 60–90K msg/s240K+ 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 阶段 1 · 解码

字节进,字段出。 零拷贝。

以 SOH 分隔的字节流原地迭代。每个 tag 都解析成对原始缓冲区的类型化视图;数值字段以无分支方式解析,方言叠加在会话绑定时应用。

span<const char>无分支SIMD 校验和
2 阶段 2 · 校验

会话状态, 确定性运行。

序列号、心跳窗口、gap-fill 语义、resend-request 怪癖。由按 venue 配置生成的状态机处理,每条转移都写入 memory-mapped 日志。

seq-num心跳重发mmap journal
3 阶段 3 · 路由

送入你的处理器, 零分配。

从固定 arena 获取一个订单槽位,通过引用填充,再通过无锁 SPSC 队列交给你的应用。槽位一直存活到订单进入终态,随后归还 arena。

SPSC 队列arena 槽位无 virtual

继续 深入。

接下来可以走的两条线:架构深度文章,或可对话的实时讲解器。

一个下午 就能接好。

NexusFIX 以单一静态库 + 一个 CLI 会话模拟器的形式发布。带一份 venue 配置和一个处理器过来,本地就能跑起一段确定性的 FIX 会话。可从日志重放,可追到字节。

探索其它 项目。

NexusFIX 是我们构建的三个引擎之一。同一套理念:能开源的就开源,性能优先,无锁定。