支付、创建订单和消息消费都可能遇到重复请求。网络超时后客户端无法判断服务端是否成功,最合理的动作通常是重试,因此服务端必须把重复视为正常情况。

选择幂等键

幂等键应该标识一次业务意图,而不是一次 HTTP 请求。由客户端生成订单请求号,服务端用唯一索引保存它,是最常见也最可靠的做法。用户 ID、时间戳或请求参数哈希通常不足以单独充当幂等键。

让数据库做最终裁决

先查询再插入存在竞态条件。两个请求可能同时查到不存在,然后各自写入。唯一约束能把并发判断交给数据库原子完成:第一次写入成功,后续写入捕获冲突并返回第一次的结果。

create unique index uk_order_request
on orders(user_id, request_id);

幂等记录需要保存状态和原始响应。正在处理时返回明确的处理中状态;成功后返回一致结果;失败是否允许重试,则应按业务失败和系统失败分别定义。

边界

幂等不能替代事务。如果创建订单还要扣库存,需要本地事务、状态机或可靠消息共同保证一致性。先写清业务语义,再选择技术手段,通常比增加一把分布式锁更稳妥。