跳转到主要内容

重试预算如何从你的仪表板中隐藏了供应商的真实错误率

阅读需 1 分钟Tian PanTian Pan

周会汇报的幻灯片上写着 99.9%。发票则显示账单翻了三倍。这两个数字在相邻的仪表盘上共存了数月,却没人发现它们衡量的是不同的世界。可靠性数值是重试后的结果——每一个最终返回 200 的调用都被计为成功——而成本数值则是客户端进行的每一次尝试,按 Token 计费。在两者之间,是一个慷慨的五次重试循环,以及一个尾部延迟正在悄悄恶化的供应商。第一次有人同时观察这两个数字是在一次故障期间,当时成本异常告警在可用性告警之前就触发了。

这就是整个模式。一个看起来像是可靠性机制的重试预算,本质上也是一个成本-质量调节旋钮,而那些只关注其中一面的团队,正在为一个发票最终会修正的可用性数字买单。

渐行渐远的两种“调用”定义

重试循环是分布式系统中最古老的模式之一。十多年来,AWS Builders' Library 一直主张,对于任何与远程服务通信的客户端来说,带有抖动的指数退避(exponential backoff with jitter)是不可或缺的。《SRE 实践手册》(The SRE Workbook)则从另一个角度提出了同样的观点:重试会将低错误率放大为更高水平的流量,一个跨越三个重试层的单一用户操作可能会对数据库产生 64 次尝试。标准的建议是为重试设置预算,以便为这种放大效应设定上限。

建议是对的。问题在于预算所隐藏的指标。

在重试循环下游计算的成功率 SLO 衡量的是客户端是否 最终 得到了答案。在任何重试发生前计算的成功率 SLO 衡量的是 供应商 是否在第一次尝试时就给了客户端答案。这是关于不同层面的不同问题,多年来它们足够接近,以至于没人需要去区分它们。但 LLM 工作负载让它们产生了分歧。

原因是重试的成本不再可以忽略不计。在微服务中重试一个 GET /healthz 几乎是免费的——几个字节,几毫秒,以及自动扩容组件根本察觉不到的 CPU 周期。但在使用工具(tool-using)的 LLM 调用中,重试意味着重新序列化系统提示词(system prompt)、对话历史、检索到的 Payload 以及用户消息——两万个输入 Token,每一次尝试都要全额计费。Anthropic 和 OpenAI 的 SDK 在遇到 429 和 5xx 错误时默认都会重试两次,这意味着一个性能略有波动的供应商可以将你的输入 Token 账单增加 1.5 倍,而你的重试后成功率指标甚至连一个基点(basis point)都不会改变。

CloudZero 的可观测性文章将这种差距描述为买单者缺失的一层。工程师看到的是可用性数字,财务看到的是发票,而双方没有一个共同的指标来解释为什么一个平稳而另一个在攀升。成本是领先指标。可用性是滞后指标。

99.9% 成功率背后隐藏了什么

想象一个供应商,其首试成功率在六周内从 99% 线性下降到 95%。由于有五次重试预算和相对独立的失败概率,重试后的成功率在整个窗口期内都保持在 99.99% 以上。仪表盘纹丝不动。周会汇报显示一切正常。

与此同时,每次成功调用所需的平均尝试次数从 1.01 次上升到 1.20 次。在一个每月运行一千万次调用、每次调用包含两万个输入 Token 的工作负载中,这意味着多出了 400 亿个计费输入 Token,这大约相当于按之前的尝试率计算的整个输入 Token 预算。发票翻倍并不是因为业务量增长,而是因为同样的业务量现在每次成功的成本更高了。

第一次有人将这两个数字联系起来通常是在故障期间。供应商的首试成功率掉下悬崖——一小时内从 95% 降至 60%——重试预算再也无法吸收失败,重试后的数字终于产生了波动。成本异常告警比可用性告警早触发四个小时,因为成本信号是尝试次数的连续积分,而可用性信号是跨越预算上限的阶跃函数。

这正是《SRE 实践手册》在告警指南中讨论的模式:告警必须对你真正关心的症状敏感,而重试后的成功率并不是那个症状。它是重试层为了平滑症状而设计的重度平滑后的转换结果。平滑后的指标是你放在状态页(Status Page)上的。它们不是你用来告警的。

重试前和重试后是两种不同的 SLO

修复方法在概念上很简单,但在操作上很复杂:将重试前成功率和重试后成功率作为独立的指标公开,每个指标都有自己的阈值和告警。

重试前成功率是客户端看到的供应商真实错误率。当它恶化时,这个数字应该驱动你与供应商的沟通。当它超过阈值时,这个数字应该触发模型或区域的故障切换(failover)。SRE 团队应该将这个数字视为依赖项的 真实 可用性,因为它每损失一个基点,你的重试预算就必须在成本上吸收一个基点。

重试后成功率是用户感知到的产品可用性。这个数字应该驱动你与领导层的 SLO 对话。它是衡量你的错误预算(error budget)是否被消耗的指标。它是状态页应该反映的数字。

会员专享

余下内容仅对会员开放。

会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。

  • 完整文章,包含未公开存档的部分
  • 可落地的工作框架,附带权衡与决策依据
  • 新文章抢先看,先于公开发布

随时取消 · 一次订阅,畅读全部

参考资料

保持联系,关注我获取更多内容

阅读需 11 分钟

无真值情况下的智能体 SLO:为无法实时评分的输出建立错误预算

传统的 SRE 实践为你提供了与用户满意度直接挂钩的可用性和延迟目标。但智能体(Agentic)特性打破了这种映射。本文将介绍当“成功”在请求发出数小时后才出现时,该如何编写错误预算——以及为什么照搬延迟 SLO 手册的团队虽然能完成每个季度的目标,却眼睁睁看着用户流失。

insider
ai-engineering
阅读需 10 分钟

随机系统的值班响应:为何你的 AI 运行手册需要重写

传统故障响应假设故障是可复现的,但 LLM 驱动的系统并非如此。以下是如何针对非确定性 AI 重写告警方案、分类决策树和事后分析模板。

insider
ai-engineering
阅读需 10 分钟

AI Agent 的 SRE:凌晨 3 点到底什么会出故障

传统的 SRE 运行手册无法涵盖 AI Agent 的失效模式。本文将探讨在生产环境中实际会发生的故障——死循环、上下文溢出、幻觉导致的 API 调用——以及如何通过监控、报警和成本控制来帮助值班工程师有效应对。

insider
ai-engineering
阅读需 10 分钟

一路重试穿过你限流器的 agent

你的 token bucket 衡量的是用户点击;账单衡量的是模型调用。当一次点击扇出成三十次调用,HTTP 边界上的限流器就变成了一把纸糊的伞。

insider
agents
阅读需 9 分钟

从 Demo 到生产环境的“税收”:原型隐藏了 90% 的 AI 开发工作

那个令全场惊叹的 AI demo 只完成了 10% 的工作。剩下的 90% —— 评估、护栏、可观测性、成本控制、回退路径 —— 正是导致 88% 的试点项目在上线前夭折的“税收”。

insider
ai-engineering