
MQ 至少一次投递、HTTP 超时重试、用户双击提交、网关层自动 failover——重复请求不是异常,是常态。幂等设计的目标只有一个:同一个业务操作执行一次和执行 N 次,结果一致。它不是某个中间件的配置,而是业务接口的属性,必须在设计期想清楚。一、幂等键:一切设计的起点
幂等的载体是「业务唯一键」,选错键一切白搭:
反例:用「用户 ID+时间戳」做键——时间戳每次都变,等于没有幂等。
UPDATE orders SET status='paid' WHERE order_id=? AND status='unpaid'——返回受影响行数为 0 即重复请求,配合唯一约束覆盖绝大多数写操作;SET idempotent:{key} 1 NX EX 600,挡在业务逻辑前面快速失败。注意它只是优化不是保证:Redis 超时或过期后仍可能穿透,必须与第 1/2 层组合使用。

幂等做没做对,用三个用例测:同请求连发两次结果一致;MQ 消息重复投递只产生一条业务记录;网络超时后客户端重试不产生双倍扣款。这三个用例过不了,任何「我们中间件保证不重复」的说法都不可信。
幂等的本质是把「重复」从故障降级为常态输入。接口设计时先问一句:这个操作被调用两次会发生什么?——答不上来,就先把幂等键定了再写代码。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。