一、撮合引擎概述

1.1 什么是撮合引擎

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

它的核心任务很简单:把买单和卖单匹配起来。你挂一个买入订单,我挂一个卖出订单,系统得在毫秒级内判断能不能成交、以什么价格成交、成交多少。

我刚开始做交易系统时,觉得这不就是个排序+匹配嘛,有什么难的?后来真正上手才发现,这里面的坑多到你想象不到。嗯,咱们后面慢慢聊。

从技术角度看,撮合引擎是一个有状态的高性能计算引擎。它维护着订单簿(Order Book),实时处理源源不断的订单流,输出成交结果。

核心定义:撮合引擎 = 订单簿管理 + 价格优先/时间优先匹配 + 成交生成

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

一个完整的交易系统,通常包含这些模块:

  • 接入层:接收客户订单,做风控检查
  • 路由层:把订单分发到对应的撮合引擎
  • 撮合引擎:核心匹配逻辑
  • 结算层:处理资金和资产的划转
  • 行情系统:发布实时成交数据

你看,撮合引擎处在中间位置。它前面连着接入和路由,后面连着结算和行情。一旦它出问题,整个交易系统就瘫痪了。

我记得有一次线上事故,撮合引擎因为内存泄漏导致GC停顿了3秒。就这3秒,交易所的订单堆积了十几万笔,恢复后瞬间爆发,直接把下游结算系统打崩了。那次之后,我们团队把撮合引擎的监控做到了「每笔订单耗时超过1ms就报警」的级别。

避坑指南:我曾经见过一个团队,把撮合引擎和业务逻辑混在一起写。结果每次业务改需求,撮合逻辑就得跟着改,改一次崩一次。记住:撮合引擎必须是独立的、无业务侵入的模块

1.3 核心功能

撮合引擎到底要做什么?我把它拆成四个核心功能:

功能模块 说明 关键点
订单管理 接收、校验、存储订单 订单状态机必须严谨
订单簿维护 维护买盘和卖盘的价量队列 价格排序、数量聚合
匹配逻辑 按规则撮合买卖订单 价格优先、时间优先
成交生成 生成成交记录,更新订单状态 部分成交、完全成交的处理

你想想看,这四个功能环环相扣。订单管理做不好,后面的匹配就是空中楼阁。订单簿维护慢了,匹配速度就上不去。匹配逻辑写错了,那整个交易所就乱套了。

1.4 设计目标

设计一个撮合引擎,我们追求什么?我个人习惯用这四个指标来衡量:

  1. 高性能:单机每秒处理10万+笔订单是基本要求。我见过用Go写的撮合引擎,单核就能跑到50万TPS。
  2. 低延迟:从收到订单到返回成交,延迟要控制在微秒级。每多1微秒,对高频交易者来说都是真金白银。
  3. 确定性:同样的订单序列,无论跑多少次,结果必须完全一致。这是金融系统的铁律。
  4. 可恢复性:系统崩溃后,能从最近的快照恢复,不丢数据、不错数据。

个人经验:很多新手一上来就追求极致性能,结果忽略了确定性。我踩过这个坑——为了优化性能用了非确定性算法,结果回放日志时发现成交记录对不上。那次教训让我明白:金融系统里,正确性永远比性能重要

下面这张图,是我自己总结的撮合引擎核心架构。你看一眼,基本就能理解整个系统的脉络了。

撮合引擎核心架构图 订单输入 订单校验 订单簿(买盘/卖盘) 匹配引擎 成交输出 价格优先 时间优先 FIFO队列 部分成交 完全成交 撤单处理

这张图展示的是最基础的撮合流程。实际生产环境中,每个环节都会复杂得多。比如订单校验这一步,除了基本的合法性检查,还要做资金校验、持仓校验、限价检查等等。

我个人习惯把撮合引擎的设计分成三个阶段:

  • 第一阶段:实现基础功能,能跑通就行。这个阶段别想太多,先让系统动起来。
  • 第二阶段:优化性能,引入内存数据库、无锁队列、批量处理等技术。
  • 第三阶段:做容灾和可恢复性设计,保证系统7x24小时稳定运行。

很多团队在第一阶段就想着做到第三阶段的事,结果项目拖了半年还没上线。我的建议是:先跑起来,再跑快,最后跑稳

一句话总结:撮合引擎是交易系统的核心,它负责把买卖双方的订单高效、公平、确定地匹配成交。设计时优先保证正确性,再追求性能,最后完善可靠性。


专注资料整理