设计一个支持万人并发抢购的秒杀系统架构方案
一、系统架构设计
面对万人级并发,核心思路是动静分离与分层削峰。整体架构分为四层:
- 客户端层:静态资源走 CDN,倒计时校准,防重复提交。
- 接入层:Nginx + Lua/OpenResty,作为第一道防线,处理限流和缓存。
- 业务服务层:无状态秒杀服务集群,配合消息队列(Kafka/RocketMQ)和 Redis Cluster。
- 数据层:主从数据库读写分离,必要时按商品或时间分库分表。
客户端层 → 接入层 → 业务服务层 → 数据层
限流 → 缓存 → 队列 → 数据库
二、核心问题解决方案
1. 超卖问题
库存扣减必须保证原子性,否则必然超卖。
方案一:Redis 原子操作
利用 Redis 单线程特性,通过 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
方案二:数据库乐观锁
作为兜底方案,更新时带上版本号校验。
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = ? AND stock > 0 AND version = ?
方案三:预扣库存策略
先预扣 Redis 库存,再异步同步到 DB。
public {
+ productId;
redisTemplate.opsForValue().decrement(key, count);
(remaining >= ) {
sendStockDeductMessage(productId, count);
;
} {
redisTemplate.opsForValue().increment(key, count);
;
}
}


