
1) 【一句话结论】采用Saga模式结合消息队列的分布式事务方案,库存系统先扣减库存并发布状态消息,订单系统订阅消息后更新状态;库存不足时快速发布失败消息,订单系统根据消息回滚订单,确保强一致性。
2) 【原理/概念讲解】
首先解释“强一致性”需求:不同区域(国内、海外)的订单、库存、物流系统需保证数据同步一致性,避免库存扣减后订单状态异常。
介绍两种核心方案:
3) 【对比与适用场景】
| 方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 两阶段提交(2PC) | 集中式协调,分预提交、提交阶段 | 强一致性,但阻塞、单点故障 | 需强一致性且系统延迟低(如金融交易) | 预提交失败时阻塞,协调者故障导致状态不一致 |
| Saga模式 | 异步解耦,通过消息队列传递状态变更,失败时补偿 | 最终一致性,低耦合,无阻塞 | 分布式系统(如电商订单、库存、物流) | 需要幂等性,消息丢失/延迟可能导致不一致 |
| 最终一致性+补偿 | 无强一致性保证,通过定时任务或人工补偿 | 低延迟,适合非关键业务 | 物流跟踪、用户行为统计 | 补偿成本高,延迟大 |
4) 【示例】
伪代码示例(库存系统、订单系统、消息队列):
def deduct_inventory(order_id, quantity):
if check_inventory(order_id, quantity):
publish_message("inventory_deduct_success", {"order_id": order_id, "quantity": quantity})
return True
else:
publish_message("inventory_deduct_fail", {"order_id": order_id, "quantity": quantity})
return False
def update_order_status(order_id, status):
subscribe_to_message("inventory_deduct_success", lambda msg: update_order(order_id, "confirmed"))
subscribe_to_message("inventory_deduct_fail", lambda msg: update_order(order_id, "cancelled"))
库存不足时,库存系统发布“inventory_deduct_fail”消息,订单系统收到后回滚订单状态。
5) 【面试口播版答案】
面试官您好,针对不同区域部署的订单、库存、物流系统,保证库存扣减与订单状态强一致性,我建议采用Saga模式结合消息队列的方案。具体来说,库存系统在处理订单时,先尝试扣减库存(如果库存不足则直接失败),然后发布“库存扣减成功”或“库存不足”的消息到消息队列;订单系统订阅这些消息,根据消息类型更新订单状态(成功则更新为“已确认”,失败则回滚为“库存不足,已取消”)。这样既保证了库存扣减与订单状态的强一致性(通过消息传递确保状态同步),又避免了分布式事务的阻塞问题。库存不足时,库存系统快速发布失败消息,订单系统收到后立即回滚订单,实现快速处理。
6) 【追问清单】
7) 【常见坑/雷区】