一、撮合引擎概述

什么是撮合引擎

撮合引擎,说白了就是交易系统的「心脏」。

你想想看,当你在交易所下了一笔买单,系统怎么知道该跟谁成交?价格怎么匹配?数量怎么分配?这些脏活累活,全是撮合引擎在干。

我个人习惯把撮合引擎定义为:一个按照特定规则,将买卖双方的订单进行匹配并生成成交记录的系统。它最核心的规则就是「价格优先、时间优先」——买单出价高的先成交,卖单出价低的先成交;价格一样的话,谁先来谁先得。

举个例子:

订单簿状态:
卖一:100.50  100股
买一:100.40  200股

新来一笔买单:100.50  50股
→ 立即与卖一成交,成交价100.50,数量50股
→ 卖一剩余50股,买单一成交完毕消失

嗯,这就是最基础的撮合逻辑。当然,真实场景要复杂得多——冰山订单、FOK、IOC、止损单……各种订单类型会让你头大。

撮合引擎在交易系统中的地位

一个完整的交易系统,通常长这样:

交易系统核心架构 接入层 API网关 / FIX协议 撮合引擎 订单簿 / 撮合逻辑 风控层 资金校验 / 限价检查 数据层 Redis / 内存数据库 持久化层 MySQL / ClickHouse 监控层 Prometheus / Grafana 撮合引擎处于核心位置,上下游依赖紧密 延迟每增加1ms,套利空间就流失一大截 ⚡ 全链路延迟目标:< 10μs

看到没?撮合引擎就在正中间。上面接着接入层,下面连着数据层,旁边还挂着风控。它要是慢了,整个系统都得跟着遭殃。

我在项目中遇到过一件事:有个同事把撮合引擎的日志打印放在了同步路径上,结果每次撮合都要等磁盘I/O。你猜怎么着?延迟从5微秒直接飙到了200微秒。就这一行代码,差点让整个系统重写。

低延迟的核心挑战

做低延迟撮合引擎,说白了就是在跟物理定律较劲。我总结了几大挑战:

挑战维度 具体问题 典型延迟
CPU缓存 缓存未命中导致内存访问变慢 60-100ns
内存分配 malloc/free 导致的不确定性 100ns-1μs
锁竞争 多线程争抢同一资源 1-10μs
系统调用 用户态/内核态切换 100ns-1μs
网络延迟 TCP协议栈开销 10-100μs

核心原则:低延迟系统设计,本质上就是「减少一切不必要的开销」。每一纳秒都很珍贵,你省下来的每一微秒,都是真金白银。

为什么会这样?因为在高频交易的世界里,你比别人慢1微秒,可能就抢不到单了。我见过一个团队,为了省掉一次内存拷贝,把整个订单数据结构重新设计了三遍。值吗?值。因为优化后延迟降了40%。

课程整体架构与学习路径

这门课一共30章,我把它分成了四个阶段:

阶段一 基础篇 第1-8章 数据结构与核心逻辑 阶段二 进阶篇 第9-16章 内存管理与无锁设计 阶段三 实战篇 第17-24章 网络优化与多线程 阶段四 调优篇 第25-30章 性能分析与压测 学习路径 从零开始 → 理解原理 → 动手实现 → 极致优化 前置要求:C++11/14基础、Linux基本操作、数据结构常识 工具链:g++ 9+、perf、valgrind、flamegraph

我的建议:别急着跳着看。前8章是地基,地基不牢,后面优化得再好也是空中楼阁。我见过太多人一上来就研究无锁队列,结果连订单簿的红黑树都写不对——嗯,最后全推倒重来了。

每个阶段我都会带着你手写代码。不是那种「这里省略一万行」的伪代码,而是真正能跑、能压测的工程代码。你想想看,学完30章,你手里就有了一套完整的低延迟撮合引擎——这感觉,不比看一堆理论文章爽?

注意:这门课不适合完全零基础的初学者。你需要至少能写C++的类、模板、STL基本容器。如果你连vector和list都分不清,建议先补补基础再回来。

好了,第一章就到这里。记住一句话:低延迟不是一种技术,而是一种思维方式。后面的每一章,我都会带你用这种思维方式去思考、去设计、去实现。


公众号:蓝海资料掘金营,微信deep3321