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

上交所的交易系统需处理每秒数万笔订单,请设计一个订单撮合的分布式架构,并说明如何保证系统的高可用和低延迟。

上海证券交易所A04难度:中等

答案

1) 【一句话结论】

针对上交所每秒数万笔订单的撮合需求,我设计的分布式架构核心是订单分片+分布式状态机+消息队列+多级缓存+主从复制,通过分片降低单节点压力,分布式状态机保证跨分片一致性,消息队列解耦,缓存提升延迟,主从保障高可用,实现高并发与低延迟的订单撮合系统。

2) 【原理/概念讲解】

老师口吻解释核心组件:

  • 订单分片:按股票代码哈希取模,将订单按股票分成多个小集合(类比“把订单库按股票分成多个小仓库,每个仓库只管部分股票的订单”),每个撮合节点处理特定股票的订单,避免热门股票导致单点过载。
  • 分布式状态机(如Zab/Paxos):跨分片订单(如涉及多只股票的撮合)通过状态机协同,确保各节点执行相同的撮合步骤(如先检查全局订单池、再匹配),避免数据不一致。
  • 分布式消息队列(Kafka):订单生成后写入队列,撮合节点消费消息处理,解耦“订单生成”与“撮合”流程,支持水平扩展,消息持久化保证不丢失。
  • 多级缓存(Redis+Memcached):订单状态、撮合结果缓存到Redis(热点数据),查询时直接从缓存获取,减少数据库压力;Memcached用于冷数据或临时缓存。
  • 主从复制(MySQL主从/Redis主从):主库写入订单数据,从库同步数据,从库提供读服务(如查询订单状态),分担压力;主从切换时,通过心跳检测故障,从库提升为主库,数据一致性由事务(如MySQL的XA事务)保证。

3) 【对比与适用场景】

分片策略对比

分片策略定义特性使用场景注意点
哈希分片按股票代码哈希取模负载均衡,但热点股票订单集中股票数量稳定,订单分布均匀热点股票导致某节点压力过大
一致性哈希股票代码映射到环上,节点取相邻节点节点增减时仅部分订单迁移股票数量变化频繁实现复杂,迁移成本高
范围分片按股票代码范围分片(如A0-A9到节点1)节点增减时需迁移部分订单股票代码有序,可按范围管理热点股票可能集中到特定范围

消息队列对比

消息队列定义特性使用场景
Kafka高吞吐、持久化、分布式顺序消费、高吞吐订单流处理、日志收集
RabbitMQ可靠投递、事务支持支持事务、消息确认事务场景、可靠消息

4) 【示例】

跨分片订单处理示例(伪代码):

  • 分片函数(Python):
    def get_shard(stock_code, shard_num=8):
        hash_val = hash(stock_code)
        return hash_val % shard_num
    
  • 订单生成(客户端):
    客户端发送订单:order_id=1001, stock_code='600000', price=10, qty=100, side='buy'
  • 订单写入Kafka:
    Kafka主题:order_topic,分区按stock_code哈希,分区0对应股票代码哈希为0的节点。
  • 撮合节点消费(节点1,处理股票代码哈希为0的股票):
    消费分区0的订单,处理订单1001(股票600000),撮合结果:匹配卖方订单,成交100股。
  • 状态同步(分布式状态机):
    撮合结果通过状态机消息(如“撮合完成”+订单ID+股票代码+成交信息)发送到其他节点,确保其他节点更新本地状态。
  • 缓存更新:
    Redis中设置stock_code:600000:order_id:1001为撮合结果,过期时间1小时。
  • 主从同步:
    MySQL主库写入订单数据(订单表、撮合结果表),从库异步复制,从库提供读服务(如查询订单状态)。

5) 【面试口播版答案】

(约90秒)
“面试官您好,针对上交所每秒数万笔订单的撮合需求,我设计的分布式架构核心是订单分片+分布式状态机+消息队列+多级缓存+主从复制。首先,订单按股票代码哈希分片到不同撮合节点(比如8个节点),每个节点只处理部分股票的订单,避免单点过载。订单生成后写入Kafka,撮合节点消费消息处理,解耦生成与撮合。跨分片订单的撮合通过分布式状态机(如Zab协议)协同,确保各节点执行相同的撮合逻辑,避免数据不一致。撮合结果缓存到Redis,查询时直接从缓存获取,减少数据库压力,提升延迟。同时,MySQL主从复制,主库写入订单,从库同步数据,从库提供读服务,分担压力。主从切换时,通过心跳检测故障,从库提升为主库,数据一致性由事务保证。这样,系统可以水平扩展,高可用,低延迟,且跨分片订单的撮合结果一致。”

6) 【追问清单】

  • 问:如何保证跨分片订单的撮合一致性?比如订单涉及多个分片时?
    回答要点:通过分布式状态机(如Zab/Paxos)同步撮合状态,确保各节点执行相同的撮合步骤(如先检查全局订单池、再匹配),避免局部不一致。
  • 问:分片策略选择哈希分片时,热点股票(如热门股票)导致某节点压力过大怎么办?
    回答要点:可采用一致性哈希或动态分片调整(如增加节点覆盖热点股票,或按股票交易量动态调整分片权重)。
  • 问:主从复制故障转移时,数据一致性的保障机制是什么?
    回答要点:MySQL主从通过事务(如XA事务)保证数据一致性,主库写入后,从库异步复制,故障转移时从库提升为主库,通过日志同步确保数据一致。
  • 问:系统如何处理节点故障?比如某个撮合节点宕机?
    回答要点:节点故障时,其他节点通过心跳检测,将故障节点的订单重新分片到其他节点,并更新分片状态,保证业务不中断。

7) 【常见坑/雷区】

  • 分片导致热点问题:仅考虑哈希分片,未处理热门股票,导致单节点压力过大。
  • 跨分片撮合一致性:未设计分布式状态机,导致订单跨分片撮合结果不一致。
  • 主从故障转移:未说明主从切换流程和数据一致性保障,表述不严谨。
  • 缓存策略:未考虑缓存与数据库的最终一致性,或缓存过期时间设置不当,导致数据不一致。
  • 延迟优化不足:未使用多级缓存或边车模式,导致查询延迟高。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1