
为解决高并发下的订单与库存强一致性,采用Saga模式(分布式事务)+消息队列异步解耦方案,通过缓存预热、幂等性设计确保数据一致性,既保证业务强一致性(通过补偿机制维持),又优化高并发性能。
旅游酒店预订系统的核心是订单创建与库存扣减的强一致性,需平衡高并发性能与数据一致性。订单处理流程:用户下单→订单创建(写入订单表,状态“待支付”)→库存扣减(检查库存,扣减后更新库存表,或通过消息队列异步扣减)→支付成功后更新订单状态。
分布式事务分类:
缓存(如Redis)用于预热热点库存,减少数据库压力;消息队列(如RabbitMQ/Kafka)解耦订单与库存系统,提高吞吐量。
类比:库存扣减像“银行转账”(需原子性),Saga模式像“多步骤业务”,每步提交,失败后回滚(补偿),确保最终一致。
| 方案类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 两阶段提交(2PC) | 领导者协调所有参与者,先预提交再提交 | 强一致性,但高并发下阻塞严重,系统易崩溃 | 需强一致性(如金融核心交易) | 领导者故障导致全系统阻塞 |
| Saga模式 | 分阶段执行,每个阶段独立提交,失败后通过补偿服务回滚 | 最终一致性,低阻塞,适合业务复杂场景(订单、库存、支付多阶段) | 旅游预订(订单、库存、支付多阶段) | 补偿逻辑复杂,需幂等 |
| 最终一致性(消息队列+补偿) | 订单创建后,发送消息到库存系统,库存系统异步处理 | 高吞吐,低延迟,允许短暂不一致 | 大促期间高并发,允许短暂不一致 | 需幂等处理,补偿延迟 |
订单创建流程(伪代码):
def create_order(user_id, hotel_id, room_type, quantity):
# 1. 创建订单(写入订单表,状态=待支付)
order_id = order_service.create(user_id, hotel_id, room_type, quantity, status='待支付')
# 2. 检查库存(缓存优先)
stock = cache.get(f'hotel_{hotel_id}_{room_type}')
if stock < quantity:
return {'code': -1, 'msg': '库存不足'}
# 3. 扣减库存(异步消息)
send_message('stock_decrease', {
'order_id': order_id,
'hotel_id': hotel_id,
'room_type': room_type,
'quantity': quantity
})
return {'code': 0, 'msg': '下单成功,库存已锁定'}
库存系统处理消息(伪代码):
@message_consumer('stock_decrease')
def handle_stock_decrease(message):
order_id = message['order_id']
hotel_id = message['hotel_id']
room_type = message['room_type']
quantity = message['quantity']
# 1. 检查订单状态(是否已支付)
order = order_service.get(order_id)
if order.status != '待支付':
# 补偿:回滚库存(如果已扣减)
rollback_stock(hotel_id, room_type, quantity)
return
# 2. 扣减库存(数据库更新)
stock = stock_service.get(hotel_id, room_type)
if stock >= quantity:
stock_service.update(hotel_id, room_type, stock - quantity)
cache.set(f'hotel_{hotel_id}_{room_type}', stock - quantity)
# 更新订单状态为已锁定
order_service.update(order_id, status='已锁定')
else:
# 补偿:回滚库存(如果库存不足)
rollback_stock(hotel_id, room_type, quantity)
# 订单状态置为失败
order_service.update(order_id, status='失败')
面试官您好,针对旅游酒店预订系统的高并发订单处理与库存同步问题,我设计的核心方案是采用Saga模式(分布式事务)结合消息队列异步解耦,同时通过缓存预热和幂等性设计优化性能。具体来说,用户下单时,订单创建与库存扣减分阶段执行:订单先写入数据库并标记为待支付,然后通过消息队列异步通知库存系统扣减;库存系统处理消息时,先检查订单状态,再扣减库存,若失败则通过补偿机制回滚。这样既保证了强一致性(通过Saga的补偿),又解决了高并发下的阻塞问题。技术选型上,订单和库存系统通过RabbitMQ/ Kafka消息队列解耦,缓存使用Redis预热热点库存,消息处理采用幂等性确保重复消费不重复扣减。关键优化点包括:缓存双写(数据库更新后同步缓存)、消息延迟重试(处理超时消息)、库存预分配(大促前预热缓存)等,确保大促期间能处理数千笔订单。