8.0
热点
AI SCORE
技术实践2026-08-08 21:57
支付幂等性深坑:超时不是失败,而是未知
dev.to · AI#分布式系统#幂等性#支付
Editor brief · 编辑速览
作者亲身经历支付重复打款事故——超时不代表失败,自己的业务状态比第三方响应更可信;幂等key应在业务层生成而非HTTP请求层,否则重试会生成新key导致重复扣款。
我是踩了坑才明白:超时并不等于失败。
有一笔付款在提供商那边成功执行了,但他们的响应始终没有送达我们这里。我们的重试逻辑忠实地执行了被赋予的职责,于是用户收到了两笔钱。
我为此困扰了很久,因为代码本身没有问题。每一行都做了它应该做的事。错误出在代码的上游。
我们在请求边界生成了幂等键,HTTP 调用获得一个 UUID,提供商据此去重。这套机制在你自己的服务在上层重试、同时为同一笔转账生成一个新密钥时就会失效。两把钥匙、一个意图,提供商无法知道它们之间的关联。修复方法是把密钥移到转账边界——一个业务意图对应一个密钥,贯穿其下每一次重试。
第二点我花了更长时间才接受:相信你自己的状态,而不是提供商的响应。超时不是失败,它是未知,你应该异步地对账,而不是在从未收到的响应上同步做判断。
我见过的支付 bug,大都不在happy path里。它们藏在"失败了"和"我不知道"之间的缝隙里。你的系统如何区分这两种情况?

We are a place where coders share, stay up-to-date and grow their careers.