
采用微服务架构结合分布式最终一致性(TCC模式),通过订单服务(幂等性+业务验证)、高并发撮合引擎(多实例+细粒度锁)、分布式交易存储(分库分表+缓存)、消息队列(异步解耦)实现百万级订单处理与交易结果最终一致性,核心保障库存、资金、交割等业务环节的原子性。
老师口吻解释核心模块与机制:
系统拆分为订单服务、撮合引擎、分布式交易存储、消息队列及业务服务(库存、资金、交割)。
| 模式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 两阶段提交(2PC) | 强一致性,协调者控制所有参与者 | 强一致性,但阻塞严重,性能低,协调者故障导致数据不一致 | 需强一致的场景(如金融核心交易) | 事务失败时协调者宕机会导致数据不一致 |
| TCC(Try-Confirm-Cancel) | 最终一致性,每个步骤有confirm/cancel | 低阻塞,高可用,需补偿逻辑 | 高并发、允许短暂不一致的场景(如大宗商品交易) | 补偿逻辑复杂,可能引入延迟 |
{
"userId": "user123",
"commodityId": "oil-001",
"quantity": 1000,
"price": 60.5,
"orderType": "buy",
"orderId": "order-20240101-001" // 订单ID,用于幂等性检查
}
def deduct_inventory(order_id, quantity):
# Try阶段:检查库存
if inventory_check(order_id, quantity) == False:
return False # 库存不足
# Confirm阶段:扣减库存
if inventory_deduct(order_id, quantity) == True:
return True
# Cancel阶段:恢复库存(失败时)
inventory_revert(order_id, quantity)
return False
def match_orders():
buy_orders = get_buy_orders_from_cache() # 从Redis获取
sell_orders = get_sell_orders_from_cache()
matched_orders = []
for buy in sorted(buy_orders, key=lambda o: o['price']):
for sell in sorted(sell_orders, key=lambda o: o['price'], reverse=True):
if buy['price'] >= sell['price']:
match = {
"buyId": buy['id'],
"sellId": sell['id'],
"quantity": min(buy['quantity'], sell['quantity']),
"price": sell['price']
}
matched_orders.append(match)
update_order_status(buy['id'], 'matched')
update_order_status(sell['id'], 'matched')
break # 一次匹配后,卖方订单处理完成
save_matched_orders_to_db(matched_orders) # 写入交易表
publish_transaction_message(matched_orders) # 发布交易完成消息
(注:多实例下,通过Redis分布式锁保证并发控制,例如:
lock = redis_lock("match_lock")
if lock.acquire():
try:
match_orders()
finally:
lock.release()
```)
面试官您好,针对高并发大宗商品交易撮合系统,我设计的整体架构是微服务拆分,核心模块包括订单服务、撮合引擎、分布式交易存储及业务服务(库存、资金、交割)。订单服务处理用户下单,先检查订单ID是否已存在(幂等性,避免重复下单),验证后写入数据库并发布撮合消息;撮合引擎多实例部署,通过Redis分布式锁保证并发下的数据一致性,根据时间/价格优先规则匹配订单;交易存储用TiDB分库分表(按商品类型),Redis缓存热点数据提升性能;消息队列解耦异步流程。为保障最终一致性,业务环节(库存、资金、交割)采用TCC模式,每个步骤有confirm/cancel操作,比如库存扣减失败后通过重试或补偿恢复。高并发下,订单服务分库分表分散写入压力,撮合引擎多线程并行处理,缓存热点数据减少数据库压力,消息队列批量消费平滑流量,确保百万级订单的吞吐。最终一致性通过TCC的补偿机制实现,即使部分步骤失败也能恢复一致性。