10万 QPS 秒杀系统架构设计
一、系统目标
设计一个能够支撑 10万 QPS(每秒10万请求) 的秒杀系统,需要满足以下目标:
- 高并发处理能力
- 系统高可用
- 库存绝不超卖
- 数据库压力可控
- 防刷、防恶意攻击
核心设计思想:
二、整体系统架构
10万 QPS 秒杀系统典型架构如下:
用户
↓
CDN
↓
WAF / 防刷系统
↓
Nginx负载均衡
↓
API Gateway
↓
秒杀服务集群
↓
Redis集群(库存)
↓
消息队列 MQ
↓
订单服务
↓
数据库集群
各层职责:
| 层级 | 作用 |
|---|---|
| CDN | 缓存静态资源,减少服务器压力 |
| WAF | 防止恶意攻击 |
| Nginx | 请求限流 |
| Gateway | 统一鉴权、限流 |
| 秒杀服务 | 核心业务逻辑 |
| Redis | 高速库存判断 |
| MQ | 削峰填谷 |
| 数据库 | 最终订单存储 |
三、秒杀系统请求流程
完整秒杀流程:
用户点击秒杀
↓
前端请求秒杀接口
↓
CDN / WAF过滤
↓
Nginx限流
↓
API Gateway限流
↓
秒杀服务
↓
Redis判断库存
↓
Redis预扣库存
↓
发送MQ消息
↓
订单服务消费MQ
↓
创建订单
↓
更新数据库库存
关键点:
大部分请求不会进入数据库
四、核心技术设计
1 Redis库存预扣
库存数据存储在 Redis:
关键点:
大部分请求不会进入数据库
四、核心技术设计
1 Redis库存预扣
库存数据存储在 Redis:
key = seckill:product:1001
value = 10000
秒杀操作:DECR key
Redis 单线程保证: 库存扣减原子性
如果:库存 < 0
直接返回: 秒杀失败
五、MQ削峰填谷
10万 QPS 不可能全部直接创建订单。
使用 MQ 做削峰:
Redis扣库存
↓
发送MQ
↓
订单服务消费
例如:
瞬时请求:100000
MQ消费速度:5000/s
Redis扣库存
↓
发送MQ
↓
订单服务消费
例如:
瞬时请求:100000
MQ消费速度:5000/s
订单系统稳定处理。
常见 MQ:
- Kafka
- RocketMQ
- RabbitMQ
六、多级限流设计
秒杀系统必须做 多级限流。
第一层:CDN
缓存静态页面。
减少 50% 请求。
第二层:Nginx限流
例如:
limit_req_zone
限制:
10000 QPS
第三层:Gateway限流
使用:
- Sentinel
- RateLimiter
例如:
每秒20000请求
第四层:用户级限流
限制:
1用户1秒1次
七、防刷机制
秒杀系统必须防止脚本攻击。
常见方案:
1 秒杀验证码
用户必须先验证。
验证码 → 秒杀
2 秒杀Token
流程:
用户登录
↓
获取秒杀Token
↓
携带Token请求
Token具有:
- 唯一性
- 过期时间
3 隐藏接口
接口路径:
/seckill/{randomPath}
避免脚本扫描。
八、数据库设计
数据库是系统最后一层。
必须优化。
1 分库分表
订单表:
order_01
order_02
order_03
常见规则:
- 按用户ID
- 按订单ID
框架:
- ShardingSphere
2 乐观锁防止并发问题
库存表:
stock
字段:
count
version
SQL:
update stock
set count = count - 1,
version = version + 1
where id = ?
and version = ?
九、系统扩展能力
10万 QPS 必须依赖 水平扩展。
服务部署:
秒杀服务 × 50实例
Redis: Redis Cluster
MQ: Kafka Cluster
数据库: MySQL 主从
十、系统高可用设计
保证系统稳定运行。
服务集群
服务多实例部署
Redis集群
Redis Cluster
MQ集群
Kafka / RocketMQ Cluster
自动扩容
使用:
Docker + Kubernetes
根据流量自动扩容。
十一、秒杀系统核心设计总结
秒杀系统设计可以总结为: 缓存 、限流 、异步 、削峰 、防刷 、分库分表
核心思想: 不要让请求直接打到数据库
十二、总结版
如果面试官问:
如何设计一个10万 QPS秒杀系统?
可以这样回答:
10万QPS秒杀系统核心通过 Redis预扣库存 + MQ削峰 + 多级限流 + 防刷机制 + 分库分表 来实现。
其中 Redis 负责高速库存判断,MQ负责削峰填谷,限流保护系统稳定,通过最终一致性保证库存正确,从而支撑10万级并发请求。

