幂等方案设计
用户点了两次支付按钮,扣了两次钱。幂等设计是金融级系统的基本功。
一、幂等的定义与重要性
- 1.1 幂等的数学定义——
f(f(x)) = f(x) - 1.2 程序中——同一个操作执行一次和执行多次的结果相同
- 1.3 哪些场景需要幂等——支付、下单、消息消费、接口重试
二、接口层幂等——Token 机制
- 2.1 客户端先获取 Token——
GET /token返回唯一 ID - 2.2 提交时带上 Token——
POST /order + token - 2.3 服务端校验 Token——Redis
DEL原子操作 - 2.4 Token 的过期时间设计
三、数据库层幂等
- 3.1 唯一索引——最简单的幂等
- 3.2 订单号作为唯一键——
INSERT ... ON DUPLICATE KEY UPDATE - 3.3 状态机约束——
UPDATE ... WHERE status = 'INIT' - 3.4 乐观锁——版本号 CAS 更新
四、Redis 层幂等
- 4.1
SETNX实现请求去重 - 4.2 Lua 脚本保证原子性——先检查后执行
- 4.3 Redis 过期时间的设置——足够长但不过长
五、消息队列幂等
- 5.1 消费者端的去重——
msgId+ Redis Set - 5.2 业务唯一键——数据库唯一约束兜底
- 5.3 消息的
exactly-once语义
六、复合场景的幂等设计
- 6.1 下单流程的幂等——Token + 订单号唯一索引 + 状态机
- 6.2 支付的幂等——支付流水号 + 支付状态判断
- 6.3 一个完整的幂等框架设计
七、总结
- 幂等是分布式系统的刚需
- 多重保障:接口层 + 数据库层 + 业务层
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!