在分布式和高并发系统中,请求重复、超时重试、消息重复是常态。幂等性设计保证同一操作执行多次,结果一致,无副作用。
1. 为什么需要幂等性
- 网络抖动、超时重试可能导致重复提交。
- 消息队列消费失败会重试。
- 用户重复点击操作按钮。
- 分布式事务的补偿机制会重复执行接口。
2. 常见实现方式
-
唯一请求标识(Request ID)
- 客户端生成唯一 ID(如 UUID),服务器端记录已处理请求。
- 再次收到相同 ID 时直接返回历史结果。
- 适合“提交订单”、“支付请求”等场景。
-
数据库约束
- 使用唯一索引防止重复插入。
- 适合写操作幂等性保障。
-
状态机控制
- 业务状态机只允许从特定状态转移。
- 例如订单状态只能从“未支付”变为“已支付”,重复请求不会再执行。
-
Token 校验机制
- 客户端请求前从服务器申请一次性 token,使用后立即失效。
- 常用于防止重复提交表单。
-
分布式锁
- Redis 或 Zookeeper 实现的锁,防止多个节点同时执行同一逻辑。
3. 幂等性设计要点
- 明确“幂等粒度”,不要全局化处理。
- 所有幂等性实现都应支持日志追踪。
- 幂等逻辑不能影响正常性能。
4. 案例分析
电商支付接口:
- 客户端生成唯一订单号。
- 服务端保存支付流水号,重复请求直接返回“已支付”状态。
- MQ 消费端通过业务键(如 orderId)实现幂等。
结论:幂等性不是锦上添花,而是后端稳定性的基本保障。设计初期考虑幂等逻辑,能减少大量线上事故。