
采用基于Saga模式的最终一致性方案,通过消息队列异步解耦订单与库存系统,订单创建后发布库存扣减指令,若扣减失败则触发补偿(库存回滚、订单取消),确保数据最终一致。
超卖问题的核心是订单创建与库存扣减的原子性缺失(传统事务无法跨服务)。方案核心是“主事件-子事件-补偿事件”链:
类比:类似银行转账,若扣款失败,系统自动退回资金,这里库存扣减失败后回滚订单,相当于“资金回退”,确保最终库存与订单数量平衡。
| 方案类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Saga模式 | 将长事务拆分为多个本地事务,通过消息队列和补偿机制保证最终一致性 | 长事务拆分,异步处理,补偿回滚 | 电商订单、支付流程等复杂业务 | 补偿逻辑复杂,需保证幂等性 |
| TCC模式 | 三阶段(Try, Confirm, Cancel),每个阶段是本地事务 | 三阶段原子性,失败后回滚 | 需要强一致性但允许部分失败的场景 | 需要业务支持三阶段操作 |
def create_order(order_data):
order_id = order_service.save(order_data) # 保存订单,返回订单ID
kafka_producer.send("stock-reduce-topic", value=order_id) # 发布库存扣减消息
return order_id
def consume_stock_reduce(order_id):
try:
stock_service.reduce_stock(order_id) # 扣减库存
except StockInsufficientError:
kafka_producer.send("stock-rollback-topic", value=order_id) # 发布补偿消息
raise # 抛出异常,由订单服务消费
def consume_stock_rollback(order_id):
order_service.cancel_order(order_id) # 取消订单
消息队列配置:Kafka持久化存储,生产者设置acks='all'(确保消息写入磁盘后返回),消费者配置重试策略(避免消息丢失导致补偿失败)。
“面试官您好,针对订单创建后库存未及时扣减导致超卖的问题,我设计了一个基于Saga模式的最终一致性方案。核心思路是订单创建与库存扣减异步解耦,通过消息队列传递操作指令,并引入补偿机制确保数据最终一致。具体来说,订单创建成功后,会发布库存扣减消息到Kafka,库存服务消费后执行本地事务扣减库存;若扣减失败(库存不足),则发布补偿消息,订单服务消费补偿消息后取消订单。这样即使库存扣减失败,也能通过补偿回滚订单,避免超卖。方案中,补偿逻辑通过订单ID作为唯一标识,确保幂等性,避免重复操作;同时,消息队列采用Kafka的持久化存储和ACK确认机制,保证指令不丢失,补偿不会因消息丢失而失败。总结来说,通过异步消息和补偿机制,实现了订单与库存的最终一致性,有效解决了超卖问题。”
acks='all',确保消息写入磁盘后才返回;消费者配置重试策略(如重试3次后丢弃),避免消息丢失导致补偿失败。