
1) 【一句话结论】高并发秒杀系统订单库存不一致,核心是通过分阶段排查(业务逻辑、系统性能、数据一致性机制),结合日志、监控、压测工具定位问题根源,最终通过优化锁策略、引入消息队列解耦或分布式事务(如TCC、Seata)确保库存与订单的强一致性。
2) 【原理/概念讲解】高并发下,库存扣减与订单创建的并发操作会导致数据不一致。例如,用户点击秒杀按钮时,系统先检查库存(可能通过乐观锁/悲观锁),再扣减库存,最后创建订单。若多个请求同时执行,库存扣减的顺序不同,可能导致“库存扣减成功但订单失败”或“订单成功但库存不足”的情况。类比:抢购商品时,多个买家同时拍下,库存扣减的顺序(如先扣减再检查库存是否为0)不同,导致有的买家成功下单,有的库存不足。
3) 【对比与适用场景】
| 解决方案 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 乐观锁 | 基于版本号或CAS,允许并发读取,冲突时重试 | 读多写少,冲突时重试 | 库存扣减频率低,并发不高 | 需要重试机制,避免死循环 |
| 悲观锁 | 加锁后独占资源,写操作前加锁 | 写操作独占,性能低 | 高并发写,库存扣减频繁 | 可能导致阻塞,需优化锁粒度 |
| 消息队列解耦 | 库存扣减后发送消息,订单服务消费 | 解耦库存与订单,异步处理 | 库存扣减与订单创建异步 | 需要消息可靠性(重试、死信队列) |
| 分布式事务(如TCC) | 分阶段提交,补偿机制 | 保证最终一致性 | 需要业务分阶段 | 实现复杂,性能影响大 |
| 分布式锁(如Redis) | 排他锁,保证同一时间只有一个请求处理 | 控制并发,保证原子性 | 高并发下的库存扣减 | 锁超时、死锁风险 |
4) 【示例】(伪代码)
用户请求秒杀:GET /seckill?skuId=1
服务端逻辑:
select stock from inventory where skuId=1 for update;update inventory set stock=stock-1 where skuId=1;insert into order (userId, skuId, quantity) values (1,1,1);5) 【面试口播版答案】(约80秒)
“面试官您好,针对高并发秒杀系统订单库存不一致的问题,我的处理流程是分阶段排查。首先,检查库存扣减与订单创建的代码逻辑(如锁类型、操作顺序),通过日志分析具体请求的执行结果(如库存扣减成功但订单失败)。接着,用压测工具模拟高并发,观察库存变化与订单数量,定位是并发还是异步问题。若为并发导致,优化锁策略(如分布式锁保证原子性);若为异步导致,引入消息队列解耦,库存扣减后发送消息,订单服务消费时再扣减库存。最终通过这些步骤确保库存与订单强一致。”
6) 【追问清单】
7) 【常见坑/雷区】