设计支持万人并发的秒杀系统架构方案
一、系统架构设计
秒杀系统的核心在于应对瞬间流量洪峰,同时保证数据的一致性。我们通常采用分层架构来隔离风险,确保核心链路稳定。
1. 分层架构思路
整体链路可以概括为:客户端 → 接入层 → 业务服务层 → 数据层。
- 客户端:静态资源走 CDN,倒计时校准时间,前端做防重复提交。
- 接入层:Nginx + Lua/OpenResty 负责第一道防线,进行限流和缓存命中判断。
- 业务层:秒杀服务集群保持无状态,配合消息队列(Kafka/RocketMQ)削峰,Redis Cluster 处理热点库存。
- 数据层:主从数据库读写分离,必要时按商品或时间分库分表。
2. 具体组件选型
- 缓存集群:Redis Cluster,存储库存和商品信息。
- 消息队列:RocketMQ 或 Kafka,用于异步下单和解耦。
- 网关:OpenResty 或 Sentinel,实现精细化的限流规则。
二、核心问题解决方案
1. 超卖问题
超卖是秒杀中最致命的问题,必须通过原子操作彻底杜绝。
Redis 原子操作
利用 Redis 的 DECR 命令或 Lua 脚本保证扣减库存的原子性。Lua 脚本可以将检查库存和扣减库存打包成一个不可分割的操作。
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock and stock > 0 then
redis.call('DECR', KEYS[1])
return 1
end
return 0
在 Java 中调用时,直接执行该脚本,返回 1 表示成功,0 表示失败。
数据库乐观锁
作为兜底方案,数据库层面使用乐观锁防止并发更新冲突。
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = ? AND stock version ?


