
针对上交所每秒数万笔订单的撮合需求,我设计的分布式架构核心是订单分片+分布式状态机+消息队列+多级缓存+主从复制,通过分片降低单节点压力,分布式状态机保证跨分片一致性,消息队列解耦,缓存提升延迟,主从保障高可用,实现高并发与低延迟的订单撮合系统。
老师口吻解释核心组件:
| 分片策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 哈希分片 | 按股票代码哈希取模 | 负载均衡,但热点股票订单集中 | 股票数量稳定,订单分布均匀 | 热点股票导致某节点压力过大 |
| 一致性哈希 | 股票代码映射到环上,节点取相邻节点 | 节点增减时仅部分订单迁移 | 股票数量变化频繁 | 实现复杂,迁移成本高 |
| 范围分片 | 按股票代码范围分片(如A0-A9到节点1) | 节点增减时需迁移部分订单 | 股票代码有序,可按范围管理 | 热点股票可能集中到特定范围 |
| 消息队列 | 定义 | 特性 | 使用场景 |
|---|---|---|---|
| Kafka | 高吞吐、持久化、分布式 | 顺序消费、高吞吐 | 订单流处理、日志收集 |
| RabbitMQ | 可靠投递、事务支持 | 支持事务、消息确认 | 事务场景、可靠消息 |
跨分片订单处理示例(伪代码):
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'order_topic,分区按stock_code哈希,分区0对应股票代码哈希为0的节点。stock_code:600000:order_id:1001为撮合结果,过期时间1小时。(约90秒)
“面试官您好,针对上交所每秒数万笔订单的撮合需求,我设计的分布式架构核心是订单分片+分布式状态机+消息队列+多级缓存+主从复制。首先,订单按股票代码哈希分片到不同撮合节点(比如8个节点),每个节点只处理部分股票的订单,避免单点过载。订单生成后写入Kafka,撮合节点消费消息处理,解耦生成与撮合。跨分片订单的撮合通过分布式状态机(如Zab协议)协同,确保各节点执行相同的撮合逻辑,避免数据不一致。撮合结果缓存到Redis,查询时直接从缓存获取,减少数据库压力,提升延迟。同时,MySQL主从复制,主库写入订单,从库同步数据,从库提供读服务,分担压力。主从切换时,通过心跳检测故障,从库提升为主库,数据一致性由事务保证。这样,系统可以水平扩展,高可用,低延迟,且跨分片订单的撮合结果一致。”