专业书籍精读 · System Design Interview Vol 2 · 第 13 章

设计证券交易所

System Design Interview Vol 2 · Ch 13 · Alex Xu & Sahn Lam · 2022

EN →

这一章讲什么?

你在手机上点一下「买入」,几毫秒后就收到「成交」——中间那台替你撮合的机器,就是证券交易所。这一章教你怎么造它。而它是全书最反常的一章:前面十二章都在教你把活摊给更多机器,这一章反过来——把最要命的那段活收回到一台机器的一个线程里。

先打个比方

想象一个农贸市场,墙上挂着两张单子:一张写着所有人愿意出的买价,一张写着所有人愿意收的卖价,都从最划算的往下排。有人喊「我 10 块买」,管理员就看卖单里有没有 10 块或更便宜的;有就当场配对,没有就把这张纸条按价格贴到墙上排队等。同样报价的,谁先来谁先成交——这面墙就叫「订单簿」,这条规矩叫「价格优先、时间优先」。

难的不是人多

你可能以为交易所难在流量大。其实不是:书里按「每天十亿笔订单」估算,摊到开市的六个半小时,也就每秒四万多笔——比一个大厂的监控系统还轻。

真正难的是另外三件事:快到离谱(慢一点点,你的单子就被别人抢在前面);绝对不能插队(先到的必须先成交,这是法律问题不是体验问题);一笔都不能错,事后还得能一帧一帧倒带回放,因为监管随时会来问「那一秒到底发生了什么」。

它的答案:只让一个人干活

如果让十个管理员同时改那面墙,就得抢着用、排着队,而且谁先改到很难说得准——顺序一乱,插队就发生了,事后也没法还原。所以交易所的办法很朴素:让一个人干,而且只让一个人干。

但在这个人之前加一道发号机:不管订单从几条线涌进来,都先在门口领一个号——1 号、2 号、3 号,写进一本流水账,然后严格按号送进去。于是两件好事一起来了:顺序被号码钉死,插队变得不可能;那本流水账原样重放一遍,就能把任何一刻的市场原封不动复原出来——换台机器重放,还得到一模一样的结果,所以备用机能随时顶上。

至于「一个人会不会太慢」——真不会。这活全在内存里做,就是翻翻两张单子、划掉几行;英国交易所 LMAX 公开说过,他们单线程每秒能处理六百万笔订单。机器的时间其实都耗在网络和操作系统上,不在撮合本身。代价也很实在:一只股票的那面墙只能待在一台机器上——想扩容,只能把不同股票分给不同机器,同一只股票扩不了。

一句话记住

交易所不靠「更多机器」取胜,靠一条不可更改的排队顺序:门口先发号,里面一个线程按号办事,号码本留着随时倒带。快、公平、可复盘,都是从这一条里长出来的。

想进到订单簿结构、定序器、延迟预算和真实交易所的数字? → 切到精读版