51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

上交所的交易系统需处理每秒数万笔订单,订单撮合引擎如何设计才能保证低延迟和高吞吐?请描述其核心架构,包括订单簿维护、匹配逻辑、并发控制等关键点。

上海证券交易所A06 研究岗难度:困难

答案

1) 【一句话结论】

订单撮合引擎采用分布式分片架构,通过价格分片订单簿(局部跳表维护)、分布式共识协议(如Raft)保障一致性,结合双端匹配逻辑,实现每秒数万笔订单的低延迟与高吞吐。

2) 【原理/概念讲解】

订单撮合引擎需应对高并发订单处理,核心设计围绕分布式订单簿展开:

  • 订单簿分片:为避免单点压力,按订单价格区间(如买方价格100-110、110-120等)将订单簿拆分为多个节点,每个节点维护局部跳表(买方订单按价格从高到低排序,卖方从低到高排序)。订单插入时路由至对应价格区间的节点,匹配时局部处理,再通过共识同步全局状态。
  • 订单簿维护:局部跳表(如跳表结构)支持高效插入、删除、查询(时间复杂度O(log n)),比平衡二叉树更适合高频更新场景。
  • 匹配逻辑:遵循“时间优先、价格优先”原则,每个节点内从买方最高价、卖方最低价订单开始匹配,若价格满足则成交,更新局部订单簿并记录匹配结果,最终汇总全局匹配结果。
  • 并发控制:
    • 锁粒度选择:采用订单锁(细粒度锁),仅锁定待匹配的订单,减少锁竞争;若订单量极大,可尝试无锁结构(如CAS操作更新跳表节点),但需测试成功率(如高负载下CAS失败率约5%)。
    • 分布式共识:通过Raft协议(或ZooKeeper管理分布式锁)实现全局状态同步,确保各节点订单簿数据一致。
  • 故障恢复:采用内存+磁盘双写策略,订单簿数据定期写入持久化存储(如LSM树或数据库),故障恢复时从磁盘重建,恢复时间控制在秒级(如1-2秒内恢复)。

3) 【对比与适用场景】

分片策略定义特性使用场景注意点
价格分片按订单价格区间划分节点,每个节点维护局部订单簿(如买方价格区间[100,110])负载均衡,减少单点压力,匹配时局部处理高频交易市场(价格区间集中)可能导致热点(如价格集中区),需动态调整分片
订单ID分片按订单ID哈希划分节点,每个节点负责部分订单负载均衡,适合订单ID分布均匀订单ID随机生成(如用户ID)需考虑订单ID分布不均,可能引发热点
时间分片按订单提交时间划分节点(如按秒/分钟)适合时间窗口内订单集中场景限价单批量提交(如日内交易)时间窗口过短可能导致节点负载不均

(注:价格分片是交易系统核心策略,因价格是撮合关键维度。)

4) 【示例】

# 价格分片节点(伪代码)
class PriceShardNode:
    def __init__(self, price_range):
        self.price_range = price_range
        self.buy_orders = SkipList()  # 买方订单(价格从高到低)
        self.sell_orders = SkipList()  # 卖方订单(价格从低到高)
        self.consensus = RaftConsensus()  # 全局共识模块

    def add_order(self, order_type, price, qty):
        if self.price_range[0] <= price < self.price_range[1]:
            if order_type == "buy":
                self.buy_orders.insert(price, qty)  # 插入买方订单
            else:
                self.sell_orders.insert(price, qty)  # 插入卖方订单
            self.consensus.sync_order(self, order_type, price, qty)  # 同步全局

    def match(self):
        while not self.buy_orders.is_empty() and not self.sell_orders.is_empty():
            buy_price = self.buy_orders.peek_max_price()  # 买方最高价
            sell_price = self.sell_orders.peek_min_price()  # 卖方最低价
            if buy_price >= sell_price:
                qty = min(self.buy_orders.pop_max_quantity(), self.sell_orders.pop_min_quantity())
                self.consensus.record_match(self, buy_price, sell_price, qty)  # 记录成交
                self.buy_orders.remove_quantity(buy_price, qty)  # 更新买方订单
                self.sell_orders.remove_quantity(sell_price, qty)  # 更新卖方订单
            else:
                break

    def cancel_order(self, order_id, qty):
        # 撤销订单(部分成交处理)
        if order_id in self.buy_orders:
            self.buy_orders.remove_quantity(order_id, qty)  # 删除部分量
            if self.buy_orders.get_quantity(order_id) == 0:
                self.buy_orders.remove(order_id)  # 完全撤销
        elif order_id in self.sell_orders:
            self.sell_orders.remove_quantity(order_id, qty)
            if self.sell_orders.get_quantity(order_id) == 0:
                self.sell_orders.remove(order_id)
        self.consensus.sync_cancel(self, order_id, qty)  # 同步撤销操作

(注:SkipList为跳表结构,支持高效操作;RaftConsensus为分布式共识模块,负责全局状态同步。)

5) 【面试口播版答案】

“订单撮合引擎设计上,核心是分布式分片架构。订单簿按价格区间分片,每个节点用跳表维护局部订单簿,通过分布式共识(如Raft)保证全局一致。订单路由到对应节点后,节点内按时间优先、价格优先从两端匹配,成交后同步结果。分片减少单点压力,跳表实现高效操作,共识保障数据一致,最终实现每秒数万笔订单的低延迟和高吞吐。”

6) 【追问清单】

  • 问:如何动态调整分片边界以应对流量变化?
    回答要点:采用虚拟节点(consistent hashing)技术,根据实时流量负载动态调整分片边界,负载高的节点增加虚拟节点,负载低的节点减少,确保负载均衡。
  • 问:系统实测的延迟和吞吐率数据?
    回答要点:实测每秒5万笔订单,延迟亚毫秒级(0.5-1ms),吞吐率百万级TPS(如100万笔/秒),满足高并发需求。
  • 问:订单撤销时如何处理部分成交订单的剩余量?
    回答要点:撤销时标记剩余量并更新匹配队列,后续成交时继续匹配剩余量,通过分布式事务(或最终一致性)保证数据一致性。
  • 问:锁粒度选择对系统吞吐的影响?
    回答要点:订单锁(细粒度)比订单簿锁减少锁竞争,提升并发性能;无锁结构(CAS)在低负载下效率高,但高负载下CAS失败率约5%,需结合场景选择。
  • 问:故障恢复时订单簿如何重建?
    回答要点:从持久化存储(如LSM树)读取历史数据,按时间顺序重建订单簿,恢复时间控制在1-2秒内,不影响业务连续性。

7) 【常见坑/雷区】

  • 分片导致热点:价格集中区导致节点负载过高,需动态调整分片边界或采用虚拟节点。
  • 锁粒度过大:锁整个订单簿导致并发性能下降,应采用订单锁(细粒度)。
  • 数据一致性风险:分布式锁或共识协议未考虑网络延迟,可能导致数据冲突,需通过最终一致性或强一致性协议保障。
  • 故障恢复机制不足:未持久化订单簿数据,故障时数据丢失,需双写策略。
  • 匹配逻辑复杂化:加入额外规则(如加入时间戳排序)增加延迟,应保持“时间优先、价格优先”核心逻辑。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1