前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
返回 AI 情报前线
All News · 全部资讯4011
  • 沙盒Fork、百万Token上下文、Agent预算管控——工具链成熟度更新
  • AI Agent工具描述占45%上下文:真实数据与认知修正
  • AI功能建设成本低但运行成本高:燃料费藏在哪
  • 别让Prompt实验烧光API预算:先搭测试脚手架
  • 移动端LLM部署决策指南:设备端、云API还是自建小服务器
  • 引入第三方Agent Skill前,先建安全回归测试夹具
  • DeepSeek低价策略冲击硅谷API定价
  • MiniMax H3权重已开源:33B模型怎么跑一文搞清
  • MCP服务器上线前必须验证什么
  • 2026持久AI Agent架构指南:协调层才是瓶颈
  • DeepSeek 低价策略迫使海外平台争相跟进
  • 我给了正确答案却用了错误机制,用户一天内识破
  • 用NVIDIA SkillSpector与LangGraph构建AI技能安全审计流水线
  • 一周三击:Kimi K3开源、Luna降价80%、推理速度分层——价格战重塑多模型架构选型
  • mAP50指标欺骗了我:端侧安全AI调试复盘
  • AI功能建造成本低,运行成本才是隐藏大头
  • 阿里Qwen3.8-Max发布:首个Max级开源模型,支持OpenAI+Anthropic双协议
  • 无标签场景下用变质测试捕获 LLM 错误输出
  • 用规格约束智能体编码全流程
  • 模型准确为何仍救不了文档AI项目
  • 支付重试中的幂等与失败分级
  • 微软推出生产级Agent运行时
  • Spring AI对话成本控制实战
  • AWS智能体全栈架构实践
  • 智能体按需切换 V8 与 Linux 运行时
  • 用AI生成FFmpeg命令的可靠方法
  • 一个刻意收窄边界的RAG库
  • Claude Opus 5主打编程与推理升级
  • Cloudflare开源智能体虚拟工作区
  • 用Python构建MCP服务完整指南
  • 用A2A协议开放网站能力
  • 用LanceDB构建低延迟编码记忆
  • 消费级显卡部署开源智能体实战
  • Lean 内核漏洞击穿 AI 数学证明
  • CoCo 扩展机制与团队共享指南
  • 阿里发布2.4万亿参数Qwen3.8-Max
  • 用向量聚类捕捉社媒早期趋势
  • Agent 部署正暴露信任边界缺陷
  • Zapier Connectors:让AI Agent免费可靠连接外部应用
  • 用Dragonfly加速大规模模型分发
  • Agent记忆系统如何生长与遗忘
  • 迁移 AgentCore 前重算成本模型
  • 用 Bedrock Nova 驱动 Claude Code
  • YC开源多人协作Agent运行框架QM
  • Eve Agent新增沙箱浏览器能力
  • Vercel推出技能包分享平台skills.sh
  • Qwen 3.8 Max 与 27B 开放权重
  • GenOffice 开源 AI 办公套件
  • Appwrite 构建 MCP 服务的取舍
  • OCR 为何无法还原真正的文档
  • AI 读取 PDF 为何频繁误判
  • 已加载 51 / 4011
8.0
热点
AI SCORE
技术实践2026-08-04 15:20

支付重试中的幂等与失败分级

dev.to · AI#支付系统#幂等性#重试策略
Editor brief · 编辑速览

文章指出周期扣款不能对所有失败统一定时重试,应区分临时故障、余额不足、授权失效和重复处理,并设置不同策略。支付请求还应使用幂等键,防止状态延迟或重复调用造成二次扣款。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

订阅计费这类系统,演示时看起来很简单,一旦进入生产环境,就会立刻变成一个分布式系统问题。核心原因在于:支付通道的失败并非非黑即白,而你的重试逻辑必须反映这种复杂性。

为什么“直接重试”算不上策略

以 Direct Debit 为例,扣款失败可能代表几种截然不同的情况:余额不足、授权已过期或被取消、账户已不存在,或者银行端发生技术故障。

如果对这些情况一视同仁,统一在 24 小时后重试,最终可能会连续数周反复请求一个已经失效的授权。更糟的是,你可能会重试一笔实际上已在银行端成功、只是结果尚未回传的付款。

更合理的思维模型,是对失败进行分类:

  • 瞬时故障(技术错误、超时)→ 尽快重试,可以安排在几小时内

  • 余额不足 → 可以重试,但应根据常见的发薪周期设置退避时间,而不是采用固定间隔

  • 授权无效或已取消 → 不要重试,立即将问题告知客户

  • 重复请求或已经处理 → 完全不要重试,这正是 idempotency key 发挥作用的地方

幂等性不是可选项

每次发起付款的 API 调用都应该携带由客户端生成的 idempotency key,而不是由服务端生成。这样,当网络请求超时、客户端随后发起重试时,就不会产生两笔扣款。

与银行卡支付相比,这一点对于银行支付通道更为重要,因为后者的反馈周期更长。如果提交 Direct Debit 请求时 API 调用超时,你确实无法知道银行是否已经收到了请求。如果没有 idempotency key 就盲目重试,可能会从真实客户的真实银行账户中重复扣款。这种故障的严重程度,远远高于一次银行卡扣款失败。

将 Webhook 作为事实来源

轮询付款状态一直有效,直到它突然失效。可扩展的模式,是把 Webhook 当作状态转换的事实来源,例如 submitted → confirmed → paid,或者 submitted → failed → retried。

同时,你需要确保系统能够应对 Webhook 乱序到达或重复投递。保存 event ID,并基于它进行去重。永远不要假设 Webhook 只会投递一次,因为在实际环境中,它几乎从来都无法做到 exactly-once。

催款不只是后端问题,也是 UX 问题

订阅业务中,相当一部分客户流失并非源于主动取消,而是因为付款失败后一直没有得到解决。

如果你的重试逻辑悄无声息地失败了三次,随后直接取消订阅,却从未提醒客户,那么你实际上是在以收入为代价,换取后端实现的简单。

优秀的系统会把后端重试逻辑与主动的客户通知结合起来,例如发送“你的付款失败了,请更新付款信息”之类的消息,并确保消息能在账户真正失效之前送达。

这些问题并非支付系统独有。任何需要处理不可靠投递、局部失败和最终一致性的系统,面对的都是同一类问题。只不过在支付场景中,一旦处理错误,后果会立即反映在某个人的银行余额上,因此风险格外直观。

这也是创业者故事中反复出现的主题:真正区分一个能够规模化发展的订阅业务和一个在不知不觉中因客户流失而持续失血的业务,通常正是那些并不光鲜的故障处理工作。

如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
模型准确为何仍救不了文档AI项目
下一篇
微软推出生产级Agent运行时