沐光而行 发表于 2026-7-3 08:51:14

股票交易所每秒撮合百万笔订单,怎么做到不出错?

https://img0.baidu.com/it/u=4175714799,2663509761&fm=253&fmt=auto&app=138&f=JPEG?w=750&h=500
       尾盘追涨以为稳赚,结果次日开盘直接跌停。很多人把这种波动归为运气不好,但你可能从没真正搞懂:你点下买入的那一秒,背后到底经历了什么。
全市场几十万人同时买卖,谁和谁成交?价格按什么定?先后顺序怎么保证公平?这三个问题必须在一毫秒内给出答案,任何一步出错,都可能引发价格异常甚至连锁崩盘。

很多人以为交易所就是个大号数据库,存存买卖数据而已。但普通数据库写一条记录,要锁表、刷盘、提交事务,一套下来几毫秒就没了。听起来很快?但交易所每秒要撮合上百万笔订单,常规数据库的速度根本跟不上。
但更关键的真相是:这套系统的核心追求从来不是 “快”,而是确定性。顶级工程师的厉害之处,就是把 “快” 和 “稳” 这对看似矛盾的要求,彻底统一了起来。

一、单线程内存撮合引擎:用 “慢思路” 换极致速度

打个比方:早市菜市场几百个摊主喊价、几百个买家还价,没有规则就会插队、错账、乱成一团,这就是多线程并发系统的通病 —— 同时操作就会产生冲突。
交易所的工程师做了个看似 “很笨” 的决定:只留一个收银员,所有订单排好队,一个接一个处理,全程只有这一个线程在操作。

你可能会问:单线程难道不会更慢?
答案藏在两个细节里:
第一,这个 “收银员” 站在超大的内存工作台前,所有订单、行情数据全部预加载在内存里,不用读硬盘、不用翻数据库,伸手就能取,扫一眼就能匹配。
第二,单线程彻底消灭了并发冲突,不用加锁、不用抢资源、不用处理线程竞争的开销。
这就是核心的撮合引擎:全内存运行、单线程串行处理,速度达到纳秒级 —— 光一秒钟能绕地球七圈半,一纳秒里光只能走 30 厘米,足以见得响应有多快。

二、无锁环形缓冲区:订单入场的高速传送带

订单是怎么送到这个 “收银员” 手里的?靠的是无锁环形缓冲区。
你可以把它想象成一条特殊的高速传送带:普通传送带每放一件货物都要暂停、加锁确认没有冲突,安全但很慢。而这条传送带用的是 CPU 指令级的原子操作,不是软件层面的加锁,速度直接快了一个数量级。
更极致的设计是:系统启动时就把传送带上的所有格子全部分配好,订单来了直接填入对应位置,连 “临时申请内存” 这个动作都省掉了。从你下单到进入撮合引擎,延迟能压到几百纳秒。

三、订单簿与撮合规则:公平的底层逻辑

订单入场后,靠订单簿(Order Book)完成撮合。
买盘按价格从高到低排序,卖盘按价格从低到高排序,两条队列一匹配:最高的买价遇上最低的卖价,立刻成交,这叫价格优先;价格相同的订单,谁先挂单谁先成交,这叫时间优先。
这两条规则被硬编码在系统最底层,没有任何人为操作的空间,市场交易的公平性,就建立在这两条简单又刚性的规则之上。

四、三层熔断机制:极端行情的防护网

如果市场突然暴涨暴跌,单靠撮合引擎根本扛不住流动性冲击,这时候就轮到三层熔断机制上场,层层拦截风险:


[*]常规涨跌停熔断:涨跌幅达到阈值直接暂停交易,是最基础的一道闸门,防止单日价格失控。
[*]动态熔断:不看全天累计涨跌幅,只监控短周期波动 —— 比如 5 分钟内价格偏离超过 3% 就临时停牌,专门应对瞬间的流动性冲击,比如大机构集中砸盘、巨额买单瞬间涌入。
[*]集合竞价恢复:熔断结束后不会直接放开交易,而是先收集一段时间的所有买卖订单,计算出一个能让成交量最大的价格,统一撮合成交。就像拍卖会先收齐所有出价再一锤定音,避免恢复交易后价格瞬间失控。

五、预写日志:零差错的最终兜底

最后还有一道终极保障,叫预写日志(WAL)。
所有订单在正式撮合之前,必须先写入日志持久化。哪怕系统当场宕机,重启后只要重放一遍日志,就能完整恢复所有订单状态,一笔交易都不会错、一笔数据都不会丢。这是整套系统 “永远不出错” 的最终答案。

回过头看,这套系统藏着三层认知:


[*]对普通交易者来说,记住一句话就够了:交易所靠单线程 + 全内存,换来了极致的速度和绝对的公平。
[*]对初级程序员来说,值得多想一层:为什么不用多线程?因为高并发下,锁的代价、冲突的不确定性,比 “慢” 更可怕。
[*]对想做架构的人来说,核心思维是:高可靠系统的设计本质,从来不是堆硬件,而是消灭不确定性。

单线程消灭并发冲突,预写日志消灭故障丢失,熔断机制消灭极端波动 —— 每一层设计,都在缩小系统可能出错的边界。
外人看交易所拼的是速度,内行才知道,它真正拼的是 “不出错”。每秒百万笔撮合零差错,说起来简单,背后是对系统确定性的极致追求。


页: [1]
查看完整版本: 股票交易所每秒撮合百万笔订单,怎么做到不出错?