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

请设计一个支持每秒百万级订单处理的股票交易系统架构,需考虑高并发、低延迟、容错性,并说明核心组件的设计思路。

上海证券交易所A02难度:困难

答案

1) 【一句话结论】:采用“分阶段预处理+无锁撮合引擎+Saga分布式事务+异步解耦+多级容错”的架构,通过订单预处理(Redis缓存+校验)、无锁撮合(并发安全匹配)、Saga补偿事务(订单一致性保障)、Kafka异步通知(解耦)、服务降级/重试(容错),实现百万级并发下的低延迟与高容错性。

2) 【原理/概念讲解】:老师口吻,解释核心逻辑。订单进入系统后,预处理阶段由Redis缓存订单簿(内存双向队列),快速校验合法性(价格、数量、用户余额,如Redis查询余额避免数据库压力);撮合引擎采用无锁算法(如时间戳排序的队列操作),并发安全匹配买卖订单,低延迟更新用户持仓(数据库事务);异步化处理通过Kafka消息队列解耦撮合与通知服务,发送状态变更消息;分布式事务采用Saga模式,订单处理分预处理、撮合、通知阶段,若某阶段失败,触发补偿事务回滚到前一个阶段(如撮合失败则回滚到预处理,重试或通知用户),保证数据一致性;容错机制设计服务降级(熔断)、消息队列重试、数据库事务回滚,确保系统故障时数据一致。

3) 【对比与适用场景】:

组件定义特性使用场景注意点
订单预处理服务校验订单合法性并写入订单簿高并发读写,内存缓存,数据库持久化订单进入系统的第一道关卡需保证校验速度,避免阻塞后续流程
无锁撮合引擎并发安全匹配买卖订单无锁算法(时间戳排序+队列操作),低延迟实时交易匹配需处理并发冲突(如价格相同时间戳排序)
Saga补偿事务分阶段事务,失败时回滚链式补偿,保证最终一致性订单全流程一致性补偿逻辑需精确,避免循环依赖
Kafka异步消息队列分布式消息系统高吞吐、持久化、解耦状态变更通知需消费组管理,避免消息积压
服务降级/熔断故障时临时停止服务限流,避免雪崩系统故障时保护需合理阈值,避免误判
数据库事务数据持久化ACID,保证数据一致性持久化操作需考虑事务隔离级别,避免锁竞争

4) 【示例】:订单请求示例(JSON):

{
  "order_id": "order_20240101_001",
  "stock_code": "600519",
  "price": 100.5,
  "quantity": 100,
  "order_type": "buy",
  "user_id": "user_001"
}

处理流程:

  1. 预处理:预处理服务检查用户余额(Redis查询,假设余额足够),校验价格(订单簿缓存校验,如价格在有效区间),合法则写入Redis订单簿(更新买方队列,价格100.5,数量100)。
  2. 撮合:无锁撮合引擎从Redis订单簿读取卖方队列(价格≤100.5的队列),并发匹配买方队列(价格≥100.5的队列),匹配成功则更新用户持仓(数据库事务:增加用户持仓,减少卖方库存),并写入Kafka(主题:order_match)。
  3. 补偿:若撮合失败(如库存不足),触发Saga补偿事务,回滚到预处理阶段(重试或通知用户,如“库存不足,订单取消”),确保数据一致性。

5) 【面试口播版答案】:面试官您好,针对百万级订单处理需求,我设计的系统核心是“分阶段预处理+无锁撮合+Saga事务+异步解耦+容错保障”,具体思路如下:首先,订单进入系统后,先经过预处理阶段,用Redis缓存订单簿(内存结构),快速校验订单合法性(价格、数量、用户余额),避免直接访问数据库。然后,撮合引擎采用无锁算法(如时间戳排序的队列匹配),并发安全地匹配买卖订单,低延迟更新用户持仓(数据库事务)。订单处理异步化,通过Kafka消息队列解耦撮合与通知服务,发送状态变更消息。容错方面,采用Saga模式,订单处理分为预处理、撮合、通知阶段,若某阶段失败,触发补偿事务回滚到前一个阶段(如撮合失败则回滚到预处理,重试或通知用户),保证数据一致性。整体架构通过负载均衡(Nginx)分发请求至集群实例,各服务水平扩展,确保高可用。这样既能应对百万级并发,又能保证低延迟和容错性。

6) 【追问清单】:

  • 问题1:如何保证订单一致性?回答:采用Saga分布式事务,每个阶段(预处理、撮合、通知)作为事务步骤,失败时触发补偿事务回滚到前一个阶段,结合Redis加锁(如订单ID锁)保证并发下的订单冲突处理。
  • 问题2:如何优化撮合算法?回答:采用“价格优先、时间优先”结合无锁算法,实时计算匹配结果,减少锁竞争,支持T+0规则,同时通过缓存预热(热点股票订单)降低延迟。
  • 问题3:如何处理系统故障?回答:订单服务熔断(如请求超时则降级),消息队列重试(失败后重试3次),数据库事务回滚,避免单点故障影响整体,并通过监控(如Prometheus)实时告警。
  • 问题4:缓存雪崩如何解决?回答:Redis集群+本地缓存(如Guava Cache),热点数据预热(如开盘前加载热门股票订单簿),限流策略(如令牌桶),避免缓存全失效导致系统崩溃。
  • 问题5:如何扩展系统?回答:微服务拆分(订单、撮合、通知、补偿服务),水平扩展各服务实例(如订单服务扩容至10个实例),消息队列水平扩展(Kafka分区增加),支持弹性伸缩应对流量波动。

7) 【常见坑/雷区】:

  • 坑1:忽略分布式事务的补偿逻辑,导致订单回滚不彻底(如撮合失败后用户持仓未回滚,数据不一致)。
  • 坑2:撮合引擎采用锁机制导致并发瓶颈(如全局锁,影响百万级并发性能)。
  • 坑3:消息队列积压导致订单堆积(如消费者处理能力不足,消息积压超过阈值,影响系统吞吐)。
  • 坑4:缓存未持久化,Redis故障导致订单簿数据丢失(如Redis宕机,订单无法匹配,数据丢失)。
  • 坑5:绝对化表述(如“确保百万级并发”),缺乏技术方案验证假设(如压力测试场景,如JMeter模拟百万并发,验证延迟和容错性)。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1