幂等Idempotency
你可能会说
支付回调可能重复送达,但同一个订单只能标记支付成功一次,重复回调要返回已处理结果。
同一个请求重复到达时,预期的业务效果仍只发生一次。例如支付平台因超时并发重发同一个回调,订单服务应以事件编号作为唯一键,原子地取得一次处理权,只把订单标记为已支付一次。幂等不等于完全没有日志、通知等副作用,也不代表不同业务请求可以共用同一个编号。
也常被叫作幂等性幂等处理
延伸阅读 · 权威出处
支付回调可能重复送达,但同一个订单只能标记支付成功一次,重复回调要返回已处理结果。
同一操作执行两次,目标结果发生了变化。
从重复处理改为原子领取:支付平台可能并发发送事件 evt_7f2;服务端要用事件编号识别同一个业务动作,并通过唯一约束或等效操作原子取得处理权。其他请求只读取处理中或已保存结果,不再次创建订单或扣款。
怎样观察改善:首次和重复回调都应得到明确结果,调用方才能停止重试。让同一事件并发到达后,仍应只有一张订单、一次支付状态变化和对应的追踪记录。
另一个场景:重复提交表单:用户在网络卡顿时多次点击“创建项目”,客户端可为这次创建动作提供同一个幂等键;服务端原子领取该键并复用首次结果,避免生成多个项目。
请让支付回调具备幂等性:以支付平台提供的稳定事件编号作为唯一键,用唯一约束或等效的原子操作在业务效果发生前取得处理权;重复回调返回已处理或处理中结果,不重复创建订单或扣款。让同一回调并发到达至少两次,确认只有一个请求取得处理权、只有一次业务状态变化。外部扣款也要使用同一幂等键或等效保护。