用户点了两次支付按钮,扣了两次钱。幂等设计是金融级系统的基本功。

一、幂等的定义与重要性

  • 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 一个完整的幂等框架设计

七、总结

  • 幂等是分布式系统的刚需
  • 多重保障:接口层 + 数据库层 + 业务层