设计一个支持万人并发抢购的秒杀系统架构方案
一、系统架构设计
1. 分层架构
整体采用分层过滤策略,流量依次经过客户端层、接入层、业务服务层和数据层。
客户端层 → 接入层 → 业务服务层 → 数据层
限流 → 缓存 → 队列 → 数据库
2. 具体组件
- 客户端:静态资源 CDN 加速、倒计时校准、防重复提交机制。
- 接入层:Nginx + Lua/OpenResty,作为第一道防线进行限流和缓存命中。
- 业务层:
- 秒杀服务集群(无状态设计)
- 消息队列(Kafka/RocketMQ)用于削峰
- 缓存集群(Redis Cluster)
- 数据层:
- 主从数据库(读写分离)
- 分库分表(按商品 ID 或时间维度)
二、核心问题解决方案
1. 超卖问题
解决库存扣减一致性是秒杀系统的重中之重。
Redis 原子操作
利用 Redis 单线程特性,通过 Lua 脚本保证检查与扣减的原子性。
public Long deductStock(String productId) {
String key = "stock:" + productId;
// Lua 脚本逻辑:获取库存 -> 判断 >0 -> DECR -> 返回结果
return redisTemplate.execute(luaScript, Collections.singletonList(key));
}
数据库乐观锁
作为最终兜底,防止极端情况下的数据不一致。
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = ? AND stock > 0 AND version = ?
预扣库存流程
先预扣 Redis 库存,再异步同步到 DB,提升响应速度。
{
+ productId;
redisTemplate.opsForValue().decrement(key, count);
(remaining >= ) {
sendStockDeductMessage(productId, count);
;
} {
redisTemplate.opsForValue().increment(key, count);
;
}
}


