10万 QPS 秒杀系统架构设计

一、系统目标

设计一个能够支撑 10万 QPS(每秒10万请求) 的秒杀系统,需要满足以下目标:

  1. 高并发处理能力
  2. 系统高可用
  3. 库存绝不超卖
  4. 数据库压力可控
  5. 防刷、防恶意攻击

核心设计思想:

二、整体系统架构

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万级并发请求。