一个代理在 90 秒内调用了我的支付应用程序接口五万次。以下是故障详情。

发布日期:2026-04-23 10:02:53   浏览量 :4
发布日期:2026-04-23 10:02:53  
4

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

那是周二凌晨 2:47。

我的手机在不到一分钟的时间内收到了 47 条警报。

“支付端点:超出速率限制”
“支付端点:429 错误”
“支付端点:中央处理器使用率 98%”

我打开了日志。眼前的景象让我心头一沉。

代理 payments-batch-23a7 在 90 秒内调用了 /transfer 端点 50,342 次

每次调用都成功了。

每次调用都转移了资金。

而应用程序接口密钥呢?它工作得完美无缺。验证了每一个请求。

我们是如何走到这一步的

三个月前,我们构建了一个多代理支付系统。

  • 代理 A(编排器)接收客户请求
  • 代理 B(风险检查)验证交易
  • 代理 C(支付执行器)调用条纹支付
  • 代理 D(通知)发送确认信息

我们像所有人一样保护它:使用应用程序接口密钥。

每个代理都有一个密钥。每个服务都验证该密钥。简单。熟悉。我们快速发布了产品。

我们以为大功告成了。

根本原因

凌晨 2:47 的事故并非黑客攻击。没有外部攻击者。

这是一个 错误

代理 B(风险检查)陷入了错误循环。每次验证失败,它都会重试。每次重试都会创建一个新的支付请求。编排器将每个请求都视为合法——因为应用程序接口密钥是有效的。

密钥告诉我们在调用。但它没有告诉我们调用了多少次在什么条件下

我们的速率限制处于人类操作水平:每个密钥每分钟 1000 个请求。代理 B 的错误循环在 90 秒内生成了 5 万个请求——远低于每分钟的限制,因为该循环分布在多个实例上。

我们没有每个代理的计数器。没有每个动作的限制。没有在代理层面设置熔断机制。

我们最初的尝试

修复方案 #1:更严格的速率限制

我们将限制降低到每个密钥每分钟 100 个请求。

三小时后,一个合法的批处理作业失败了。客户投诉不断。我们回滚了更改。

修复方案 #2:支付需人工审批

每笔转账都需要有人在仪表板中点击“批准”。

代理本应是自主的。这完全违背了初衷。代理需要等待数分钟让人类点击。吞吐量崩溃。

修复方案 #3:硬编码代理标识

我们将代理标识嵌入到支付服务逻辑中。

这在添加新代理类型之前是可行的。然后你需要修改代码。然后进行测试。然后部署。然后祈祷一切顺利。

我们在两周内添加了四种新的代理类型。硬编码方法一夜之间变得无法维护。

真正有效的方案

我们意识到我们需要四样应用程序接口密钥无法提供的东西:

  1. 每个代理的计数器 — 代理 B 可以调用转账 100 次。之后它将被阻止。
  2. 每个动作的限制 — 风险检查可以调用“验证”1 万次,但只能调用“转账”100 次。
  3. 有时限的权限 — 批处理代理仅在凌晨 2 点到 4 点之间工作。在该时间窗口之外,调用将被拒绝。
  4. 委托追踪 — 当代理 C 调用条纹支付时,我们需要知道完整的链路(A → B → C),而不仅仅是 C。

我们将这四功能构建到一个我们称为 Codios 的系统中。

Codios 如何改变我们凌晨 2:47 的问题

以下是现在当代理调用我们的支付端点时发生的情况:

之前(应用程序接口密钥):

  • 检查密钥 → 有效 → 执行 → 资金转移 → 审计日志显示“代理 C 调用了 /t

    免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部