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:硬编码代理标识
我们将代理标识嵌入到支付服务逻辑中。
这在添加新代理类型之前是可行的。然后你需要修改代码。然后进行测试。然后部署。然后祈祷一切顺利。
我们在两周内添加了四种新的代理类型。硬编码方法一夜之间变得无法维护。
真正有效的方案
我们意识到我们需要四样应用程序接口密钥无法提供的东西:
- 每个代理的计数器 — 代理 B 可以调用转账 100 次。之后它将被阻止。
- 每个动作的限制 — 风险检查可以调用“验证”1 万次,但只能调用“转账”100 次。
- 有时限的权限 — 批处理代理仅在凌晨 2 点到 4 点之间工作。在该时间窗口之外,调用将被拒绝。
- 委托追踪 — 当代理 C 调用条纹支付时,我们需要知道完整的链路(A → B → C),而不仅仅是 C。
我们将这四功能构建到一个我们称为 Codios 的系统中。
Codios 如何改变我们凌晨 2:47 的问题
以下是现在当代理调用我们的支付端点时发生的情况:
之前(应用程序接口密钥):
- 检查密钥 → 有效 → 执行 → 资金转移 → 审计日志显示“代理 C 调用了 /t
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。