秒杀系统与 CAP 理论解构
秒杀系统因承接天量请求采用分布式,多节点导致网络分区(P),下单阶段用 AP 保可用、付款阶段用 CP 保一致性,业务上两种模式兼顾。
一、CAP 理论理解
在分布式系统中,CAP 理论表明:
- C(Consistency):所有节点看到的数据是一致的
- A(Availability):每个请求都能得到响应
- P(Partition tolerance):系统能够容忍网络分区
核心理解:
在网络分区不可避免的前提下,系统如果保证所有请求都能及时响应(A),就无法保证所有节点的数据实时一致(C);反之,如果要保证实时一致(C),就必须在分区时拒绝或阻塞部分请求,从而牺牲可用性(A)。
工程上,网络分区是常态,而不是异常;P 是前提条件,不可选择,只能在 A 与 C 之间做取舍。
二、秒杀系统理解
秒杀系统的核心特性如下:
- 流量暴涨
- 特定活动截止前请求量激增,单台服务器无法承受,需要分布式架构。
- 票据不能超卖
- 座位有限,每个座位只能售出一次,最终一致性约束不可妥协。
- 付款成功才算真正成功
- 下单与付款是两个阶段,下单只是获得付款资格,最终付款才是真正资源分配。
结合 CAP 理论:
- 系统必须分布式(满足条件 1),因此存在 C 与 A 的选择。
- 由于票据唯一性(条件 2),最终票务分配必须保证 C。
- 下单阶段的可用性(条件 3)允许选择 A,以承接高并发请求。
三、秒杀系统的阶段拆解
根据业务约束和 CAP 理论,可以将秒杀系统拆解为两个阶段:
| 阶段 | 目标 | CAP选择 | 特点 |
|---|---|---|---|
| 下单(AP阶段) | 承接洪峰、快速响应 | AP | 弱一致、允许超卖、异步处理 |
| 付款(CP阶段) | 确保票据唯一、支付一致 | CP | 强一致、阻塞或拒绝冲突、最终裁定资源归属 |
核心思想:AP 阶段先过滤和承接流量,CP 阶段裁定最终结果。
AP 阶段只是“获得付款资格”,CP 阶段才是真正票的归属。
四、下单阶段(AP)的经典实现方式
目标
- 承受高并发流量
- 快速响应用户
- 尽量提前过滤掉大量不可能成功的请求
核心手段
- 无状态服务
- 多节点承接请求,节点间不做同步,易于水平扩展。
- 缓存库存
- Redis 或本地缓存保存剩余票数
- 使用原子操作(Lua 脚本或 Redis
INCR/DECR)快速扣减
- 削峰与限流
- Nginx / Gateway 限流
- 本地队列排队,提前拒绝不可能成功的请求
- 异步写入
- 下单记录可写入 MQ 异步落库
- 允许短暂不一致
- 超卖或重复请求可以存在,最终在 CP 阶段裁定
特点总结
- 高可用:请求快速响应
- 弱一致:库存可能超卖或重复
- 技术核心:缓存原子操作、异步队列、无状态服务、削峰限流
五、付款阶段(CP)的经典实现方式
目标
- 保证票据唯一
- 确保支付与座位状态一致
- 不追求极致吞吐,但必须保证强一致性
核心手段
- 单点/分片强一致写入
- 座位表或票据表使用唯一索引
- 付款时使用事务操作:检查是否售出、锁定座位、写订单/付款记录
- 行级锁或 CAS 原子操作
- 保证同一座位只能被一个事务成功操作
- 幂等处理
- 防止重复支付或重复请求
- 事务边界尽量小
- 仅锁核心资源,避免长事务阻塞
- 错误与补偿机制
- 支付失败或回调异常时,异步回滚座位锁定或库存
特点总结
- 强一致:票据唯一、支付与座位严格绑定
- 可控吞吐:并发量远低于 AP 阶段
- 技术核心:事务、行级锁、唯一索引、幂等、补偿机制
六、AP 与 CP 的衔接
- AP 阶段承接洪峰,快速过滤请求,允许超卖和重复。
- CP 阶段裁定最终票据归属,确保资源唯一性与支付一致性。
- CAP 选择在业务关键点发生:
- AP 阶段选择可用性(A)
- CP 阶段选择一致性(C)
核心思想:在网络分区不可避免的前提下,系统通过延迟一致性约束而不是放弃一致性,实现整体高可用。