秒杀系统
本章节介绍高并发秒杀系统的设计思路与关键实现。
核心挑战
- 瞬间高并发流量(QPS 百万级)
- 库存超卖问题
- 数据一致性保障
- 接口防刷与安全
整体架构
用户请求 → CDN/网关限流 → 消息队列削峰 → 异步扣减库存 → 结果回调关键技术点
| 环节 | 技术方案 |
|---|---|
| 限流 | Nginx + Sentinel 多级限流 |
| 缓存 | Redis 预热库存,原子操作扣减 |
| 削峰 | Kafka/RabbitMQ 异步处理订单 |
| 防超卖 | Lua 脚本原子操作 / 数据库乐观锁 |
| 防刷 | 验证码 + 黑名单 + 接口加密 |
库存扣减方案
java
// Redis Lua 脚本原子扣减库存
String lua = "local stock = tonumber(redis.call('get', KEYS[1])) " +
"if stock <= 0 then return -1 end " +
"redis.call('decr', KEYS[1]) " +
"return stock - 1";常见问题
Q: 如何防止超卖? 使用 Redis Lua 脚本保证原子性,同时数据库层加乐观锁兜底。
Q: 如何保证消息不丢失? 消息队列开启持久化,消费端手动 ACK,失败重试 + 死信队列。
