完整架构:秒杀系统的最终架构图

回顾:我们走过了怎样的旅程?🎬

经过前面六章的学习,我们已经掌握了秒杀系统的各个核心模块。现在,让我们把这些拼图组合起来,看看最终的完整架构是什么样子的!🚀


完整架构图 🏗️

最简单的三层架构,直接访问数据库
用户层
用户请求 Web / App / 小程序
应用层
应用服务器 处理业务逻辑
数据层
MySQL 订单、库存数据
增加 Redis 缓存层,提升性能
用户层
用户请求 高并发访问
应用层
应用服务器 ×10 库存扣减逻辑
缓存层
Redis 集群 ×6 库存预扣减
数据层
MySQL 主从 ×3 订单持久化
引入消息队列,削峰填谷
用户层
用户请求 10万 QPS
接入层
API Gateway ×9 限流、鉴权
服务层
秒杀服务 ×10 库存扣减
订单服务 ×5 异步下单
数据层
Redis 集群 ×6 库存缓存
Kafka ×3 消息队列
MySQL ×3 持久化
高可用、高性能的完整秒杀系统
用户层
用户请求 Web / App / 小程序 / H5
CDN 层
CDN 静态资源加速
接入层
Nginx LB ×4 负载均衡
API Gateway ×9 限流、鉴权、黑名单
服务层
秒杀服务 ×10 库存扣减、订单创建
商品服务 ×5 商品信息、库存查询
用户服务 ×5 用户信息、实名认证
数据层
Redis 集群 ×6 库存缓存、分布式锁
Kafka ×3 异步下单、日志
MySQL 主从 ×6 订单、用户数据
辅助系统
反欺诈系统 设备指纹、行为分析
监控系统 Prometheus + Grafana
日志系统 ELK Stack

核心流程详解 🔄

1. 秒杀请求处理流程

2. 库存扣减流程

3. 异步订单创建流程


数据流向图 📊

用户请求


┌──────────────────────────────────────────┐
│  CDN (静态资源直接返回)                   │
└──────────────────────────────────────────┘


┌──────────────────────────────────────────┐
│  Nginx (负载均衡)                         │
└──────────────────────────────────────────┘


┌──────────────────────────────────────────┐
│  API Gateway                             │
│  ├─ 限流检查 → Redis                     │
│  ├─ 黑名单检查 → Redis                   │
│  └─ 鉴权 → JWT                           │
└──────────────────────────────────────────┘


┌──────────────────────────────────────────┐
│  反欺诈系统                               │
│  ├─ 设备指纹 → Redis                     │
│  ├─ 行为分析 → 实时计算                   │
│  └─ 风险评分                             │
└──────────────────────────────────────────┘


┌──────────────────────────────────────────┐
│  秒杀服务                                 │
│  ├─ 库存预检查 → Redis                   │
│  ├─ 库存扣减 → Redis (Lua 脚本)          │
│  └─ 发送消息 → Kafka                     │
└──────────────────────────────────────────┘


┌──────────────────────────────────────────┐
│  Kafka (消息队列)                        │
└──────────────────────────────────────────┘


┌──────────────────────────────────────────┐
│  订单服务 (Consumer)                      │
│  ├─ 创建订单 → MySQL                     │
│  ├─ 扣减库存 → MySQL (乐观锁)            │
│  └─ 发送通知 → 消息推送                   │
└──────────────────────────────────────────┘


用户收到结果

系统容量规划 📈

服务器配置

组件数量配置用途
Nginx4 台8C16G负载均衡
API Gateway9 台8C16G网关服务
秒杀服务10 台16C32G核心业务逻辑
商品服务5 台8C16G商品查询
用户服务5 台8C16G用户信息
Redis Master3 台16C64G主节点
Redis Slave3 台16C64G从节点
MySQL Master3 台32C128G主库
MySQL Slave3 台32C128G从库
Kafka Broker3 台16C64G消息队列

性能指标

指标目标值说明
QPS100,000+峰值处理能力
P99 延迟< 100ms99% 请求在 100ms 内返回
可用性99.99%年停机时间 < 53 分钟
库存准确率100%零超卖
反欺诈准确率> 95%黄牛识别率

关键技术栈 🛠️

配置要点

  • 配置表达的是环境差异和运行参数,不是业务规则本身。
  • 队列、缓存、存储和服务参数决定系统在高峰期的缓冲能力。

想一想

问题 1:如果 Redis 集群宕机,系统还能工作吗?

点击查看答案

降级策略:

  1. 本地缓存兜底(Guava Cache / Caffeine)
  2. 直接查数据库(性能下降,但可用)
  3. 限流更严格(保护数据库)
  4. 页面提示”系统繁忙,请稍后再试”

核心原则:保证可用性 > 保证性能

问题 2:如何保证 Redis 和 MySQL 的库存一致性?

点击查看答案

最终一致性方案:

  1. Redis 先扣减(快速响应用户)
  2. 异步消息同步到 MySQL
  3. 定时对账任务检查差异
  4. 发现不一致时,以 MySQL 为准回滚

关键点:允许短暂不一致,但最终必须一致

问题 3:如果秒杀流量超过预期 10 倍,怎么办?

点击查看答案

应急方案:

  1. 立即启动更严格的限流(降级到 1 万 QPS)
  2. 静态页面直接返回”已售罄”(如果库存已完)
  3. 关闭非核心功能(评论、推荐等)
  4. 扩容(如果有预留资源)
  5. 启用备用集群(如果有灾备)

预防方案:

  1. 提前压力测试,了解系统上限
  2. 预留 50% 以上的资源余量
  3. 制定详细的应急预案