
1) 【一句话结论】
秒杀系统订单与库存强一致性可通过分布式事务(如Seata TCC)或最终一致性方案(如消息队列+补偿)实现,前者保证强一致性但复杂度高、性能受事务开销影响,后者性能高但需设计容错机制(如幂等、超时重试)。
2) 【原理/概念讲解】
首先,秒杀场景下订单与库存需“同时操作”,若仅保证最终一致性,可能导致“超卖”(订单已创建但库存未扣减)。
Try(预检查并预留资源)、Confirm(提交资源)、Cancel(回滚资源)三个阶段。类比“三步曲”:先“试”(检查库存是否足够,预留库存)、再“确认”(真正扣减库存)、若失败则“取消”(释放预留库存)。3) 【对比与适用场景】
| 方案类型 | 定义 | 核心特性 | 适用场景 | 注意点 |
|---|---|---|---|---|
| 分布式事务(TCC) | 基于补偿的分布式事务,通过Try/Confirm/Cancel三阶段保证强一致性 | 强一致性、事务原子性、Try阶段不阻塞 | 对一致性要求极高(如秒杀、金融交易) | 实现复杂、性能受事务开销影响、补偿逻辑需严谨 |
| 最终一致性 | 通过异步消息、最终状态机保证一致性,允许短暂不一致 | 高性能、低延迟、异步解耦 | 对一致性要求较低(如普通商品购买) | 需设计容错机制(幂等、超时重试)、可能存在超卖风险 |
4) 【示例】(以TCC为例)
秒杀场景伪代码:
用户请求秒杀商品ID=1001,数量=1:
inventoryService.tryDecrease(1001, 1)(Try阶段,检查库存是否足够,预留库存)orderService.tryCreate(1001, 1)(Try阶段,创建订单)inventoryService.confirmDecrease(1001, 1)(Confirm阶段,真正扣减库存)若库存不足:
inventoryService.tryDecrease(1001, 1) → 返回“库存不足”inventoryService.cancelDecrease(1001, 1)(Cancel阶段,释放预留库存)orderService.cancelCreate(1001, 1)(Cancel阶段,取消订单)5) 【面试口播版答案】
面试官您好,关于秒杀系统订单与库存的强一致性设计,核心结论是:我们可以通过分布式事务(如Seata TCC)或最终一致性方案实现。
首先,分布式事务通过Try/Confirm/Cancel三阶段保证强一致性,比如秒杀时先预留库存再扣减,若失败则回滚,适合对一致性要求极高的场景,但实现复杂、性能受事务开销影响。
最终一致性方案则通过异步消息解耦,订单服务先扣库存(异步),库存服务处理消息后扣减,若库存不足则通过补偿机制恢复,适合对性能要求高的场景,但需设计容错机制(如幂等、超时重试)。
具体来说,比如秒杀时,订单服务调用库存服务Try阶段检查库存,成功后Confirm扣减,失败则Cancel回滚,这样保证订单与库存强一致。或者用最终一致性,订单服务发送扣库存消息到MQ,库存服务消费后扣减,若库存不足则消息被丢弃,订单服务超时后重试,直到成功或失败。两种方案各有优劣,需要根据业务需求选择。
6) 【追问清单】
7) 【常见坑/雷区】