
1) 【一句话结论】秒杀系统需通过“限流防雪崩+分布式锁防超卖+消息队列解耦+幂等+最终一致性”架构,结合分库分表提升性能,核心是“限流+锁+异步+幂等”的协同设计,最终保证订单-库存-支付最终一致性。
2) 【原理/概念讲解】
秒杀场景的核心矛盾是百万并发下的库存一致性,需采用最终一致性(而非强一致性,因强一致性在高并发下成本极高,允许少量超卖但最终通过补偿机制恢复一致性,如超卖商品后续退款或补货)。关键技术点如下:
SETNX原子操作),锁整个商品库存(锁粒度选择依据:提升并发度,避免锁太细导致资源浪费,同时设置超时时间(如10秒)防死锁,超卖后通过补偿机制处理)。3) 【对比与适用场景】
| 方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| Redis分布式锁 | 利用SETNX原子性,加超时时间 | 原子性,支持超时自动释放,分布式 | 秒杀库存锁定、订单生成 | 需Redis集群,锁粒度需合理(锁整个商品库存),超时时间需设置合理 |
| Zookeeper | 利用临时节点监听变化 | 顺序性,支持复杂协调 | 需高可用Zookeeper,复杂锁管理 | 配置复杂,节点故障锁失效 |
| 数据库锁 | 直接用数据库行锁 | 依赖数据库,简单 | 库存表小、并发低 | 性能差,会导致系统阻塞 |
4) 【示例】
用户请求示例(JSON):
{
"user_id": 123,
"goods_id": 1001,
"quantity": 1
}
服务端流程:
SETNX "lock:goods:1001" "user:123" ex 10 nx,成功则获取锁。goods_id % 100到db1)执行UPDATE stock SET count = count - 1 WHERE goods_id = 1001 AND count >= 1,返回成功。user_id % 100到order_db1)消费消息,生成订单(INSERT orders (user_id, goods_id, quantity, status) VALUES (123, 1001, 1, 'pending')),并调用支付服务(异步)。5) 【面试口播版答案】
面试官您好,秒杀系统要解决百万并发下的库存一致性问题,核心架构是“限流防雪崩+分布式锁防超卖+消息队列解耦+幂等+最终一致性”。首先,用令牌桶限流(每秒1万令牌),超过则返回错误;然后,库存扣减时用Redis分布式锁(SETNX加超时10秒),成功后扣库存;接着,订单生成与库存扣减异步处理(Kafka),解耦高并发压力;最后,所有操作做幂等处理(如订单号唯一),避免重复下单。同时,按商品ID模100分库,订单表按用户ID分表,提升读写性能。这样既能保证订单-库存-支付最终一致性,又能应对百万并发。
6) 【追问清单】
SETNX是原子操作,但需注意锁超时时间(如10秒)防死锁,同时锁粒度选择(锁整个商品库存),避免资源浪费。goods_id+request_id),扣库存时检查当前库存是否足够,若足够则扣减,否则返回失败,重试不会重复扣减。goods_id % 100),订单表按用户ID模100分表(如user_id % 100),提升读写性能。7) 【常见坑/雷区】