商品库存秒杀系统架构设计

📅 2026/7/7 19:28:17 👁️ 阅读次数 📝 编程学习
商品库存秒杀系统架构设计

商品库存秒杀系统架构设计

目录

  1. 概述
    1.1 业务规则
    1.2 核心能力
  2. 整体架构与服务交互
    2.1 分层架构链路
    2.2 订单与库存四大交互链路
  3. 各服务职责边界
    3.1 网关
    3.2 客户端聚合服务
    3.3 订单服务
    3.4 库存服务(并发安全核心层)
  4. 数据存储设计
    4.1 MySQL 商品库存表 seckill_goods_stock
    4.2 MySQL 冻结流水表 stock_freeze_record(幂等核心)
    4.3 Redis Key设计
  5. 四层库存并发安全控制(防超卖、脏写、重复操作)
    5.1 第一层:前置流量削峰
    5.2 第二层:Redis层并发防护
    5.3 第三层:MySQL行锁原子更新
    5.4 第四层:幂等唯一索引兜底
  6. 核心业务全流程
    6.1 库存查询流程
    6.2 下单主流程(含并发控制)
    6.3 三条异步收尾流程
  7. 缓存一致性方案
  8. 数据一致性兜底保障
  9. 核心代码示例
    9.1 订单服务创建订单
    9.2 库存服务冻结接口(分布式锁+原子操作)
  10. 架构约束与避坑规范

1 概述

1.1 业务规则

  1. 下单先创建订单,再冻结库存;订单状态分为:待支付、已支付、已取消。
  2. 库存双字段设计:total_stock总库存、freeze_stock冻结库存,可售库存 = total_stock - freeze_stock
  3. 支付成功仅修改冻结流水状态,total_stockfreeze_stock数值不变;仅仓库发货完成后同步扣减两层库存。
  4. 订单服务单向RPC调用库存服务,无循环依赖;库存所有变更逻辑收口于库存服务。

1.2 核心能力

流量分层削峰、四层并发安全控制、Redis原子库存操作、MySQL行锁幂等、先删缓存+延时双删、多链路最终一致性兜底。

2 整体架构与服务交互

2.1 分层架构链路

客户端(App/小程序/H5) ↓ HTTP 网关Gateway(限流、鉴权、防刷) ↓ HTTP 客户端聚合服务(参数校验、接口聚合、前端收口) ↓ RPC(Feign/Dubbo) 【订单服务】业务调度中心 ↓ 四条同步/异步RPC调用 【库存服务】库存唯一管控服务 ├─ Redis集群:可售库存缓存 + 商品分布式锁 └─ MySQL库存库:商品库存表、冻结流水表 外部依赖:第三方支付平台、仓储系统(仅推送事件至订单服务)

2.2 订单与库存四大交互链路

  1. 下单冻结(同步主流程)
    订单创建待支付订单 → RPC调用库存冻结接口;Redis原子扣减预占名额,MySQL新增冻结流水并增加冻结库存;冻结失败订单置为已取消。
  2. 支付锁定(异步)
    支付回调更新订单为已支付 → RPC调用库存仅更新流水状态,不修改库存数值。
  3. 订单取消/超时(异步)
    订单改为已取消 → RPC调用库存解冻,Redis归还可售名额、MySQL扣减冻结库存。
  4. 仓库发货(异步)
    仓储推送发货消息至订单 → RPC调用库存扣减总库存与冻结库存,标记流水为已发货。

3 各服务职责边界

3.1 网关

全局登录鉴权、账号/IP限流、令牌桶削峰、非秒杀时段拦截、请求路由。

3.2 客户端聚合服务

前端统一收口,参数校验、用户限购、重复下单拦截、多服务数据聚合,不操作库存与订单底层库表。

3.3 订单服务

  1. 本地事务创建订单,主动发起库存相关RPC调