一、撮合引擎概述
什么是撮合引擎
撮合引擎,说白了就是交易系统的「心脏」。
你想想看,当你在交易所下了一笔买单,系统怎么知道该跟谁成交?价格怎么匹配?数量怎么分配?这些脏活累活,全是撮合引擎在干。
我个人习惯把撮合引擎定义为:一个按照特定规则,将买卖双方的订单进行匹配并生成成交记录的系统。它最核心的规则就是「价格优先、时间优先」——买单出价高的先成交,卖单出价低的先成交;价格一样的话,谁先来谁先得。
举个例子:
订单簿状态:
卖一:100.50 100股
买一:100.40 200股
新来一笔买单:100.50 50股
→ 立即与卖一成交,成交价100.50,数量50股
→ 卖一剩余50股,买单一成交完毕消失
嗯,这就是最基础的撮合逻辑。当然,真实场景要复杂得多——冰山订单、FOK、IOC、止损单……各种订单类型会让你头大。
撮合引擎在交易系统中的地位
一个完整的交易系统,通常长这样:
看到没?撮合引擎就在正中间。上面接着接入层,下面连着数据层,旁边还挂着风控。它要是慢了,整个系统都得跟着遭殃。
我在项目中遇到过一件事:有个同事把撮合引擎的日志打印放在了同步路径上,结果每次撮合都要等磁盘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章,我把它分成了四个阶段:
我的建议:别急着跳着看。前8章是地基,地基不牢,后面优化得再好也是空中楼阁。我见过太多人一上来就研究无锁队列,结果连订单簿的红黑树都写不对——嗯,最后全推倒重来了。
每个阶段我都会带着你手写代码。不是那种「这里省略一万行」的伪代码,而是真正能跑、能压测的工程代码。你想想看,学完30章,你手里就有了一套完整的低延迟撮合引擎——这感觉,不比看一堆理论文章爽?
注意:这门课不适合完全零基础的初学者。你需要至少能写C++的类、模板、STL基本容器。如果你连vector和list都分不清,建议先补补基础再回来。
好了,第一章就到这里。记住一句话:低延迟不是一种技术,而是一种思维方式。后面的每一章,我都会带你用这种思维方式去思考、去设计、去实现。
公众号:蓝海资料掘金营,微信deep3321