在真实业务里,重复请求是常态,不是异常。
网络抖动、客户端重试、消息重复投递都会让同一个动作被触发多次。
如果后端没有幂等设计,就会出现重复下单、重复扣款、重复发券等严重问题。
幂等的核心目标
同一业务动作被执行多次,系统结果保持一致。
要实现这个目标,关键是定义“同一动作”的唯一标识,也就是幂等键。
幂等键怎么设计
常见做法:
- 客户端生成请求唯一 ID
- 服务端按“用户 + 业务对象 + 时间窗”生成键
- 网关层透传或统一注入幂等键
幂等键要进入持久化存储,不能只放内存,否则实例重启就失效。
幂等与重试要成对设计
只做重试不做幂等,会把小故障放大成业务事故。
一套更稳的组合是:
- 客户端指数退避重试
- 服务端幂等检查
- 明确不可重试错误码
这样才能既提升成功率,又不破坏数据一致性。
实战建议
- 支付与库存场景优先做强幂等
- 读接口重试要设置总超时预算
- 对异步回调场景做去重日志和补偿任务
幂等设计的价值往往在“异常时刻”才会被真正看见。