← 中文资源

简体中文版本

韧性预算(Resilience Budget)

韧性预算预先保留容量、错误容忍度和工程时间,使故障能被吸收并在用户侧目标被突破前完成恢复。

阅读英文原文

概念

韧性预算是系统容量和团队时间中刻意留出用于失败的部分,包含三块:容量余量,使幸存副本在损失后吸收流量;错误容忍度,使一个糟糕小时不会耗尽可靠性目标;响应能力,使工程师能调查事故而不必放弃全部计划工作。预算在故障发生时被消耗,通过设计而非乐观来补充。

为什么单独设预算

错误预算衡量相对 SLO 的可接受不可靠程度,却不描述架构能否承受产生这些错误的那次故障。服务可能仍在错误预算内,却没有任何余量运行,于是下一次实例丢失就变成事故。韧性预算把这种隐藏依赖显式化,也覆盖人力:没有余量的团队无法在同一周处理长时间事故和发布。

覆盖范围

容量余量包括 N+1 或 N+2 冗余、自动伸缩余量、队列容量和数据库故障转移容量。错误容忍度包括允许的燃烧率和暂停发布的策略。响应余量包括值班轮换规模、运行手册维护和演练时间。与纯错误预算相比,这个框架把可靠性承诺与维持承诺所需资源绑定在一起。

消耗、治理与局限

衡量一次故障实际消耗多少余量。事故后追问储备是否足够、响应是否侵占了计划工作。与产品和运维每季度复审预算。如果功能工作持续吃掉储备,可靠性就是在向未来事故借债。预算是计划启发式,而非精确会计单位,其价值在于让权衡可见。例如,团队可以选择保留百分之二十的闲置容量而不是最大化利用率,并用停机成本数据为该选择辩护。

代码示例

import retry from 'retry';

async function fetchWithRetry(url, { signal } = {}) {
  const operation = retry.operation({
    retries: 5,
    factor: 2,
    minTimeout: 500,
    maxTimeout: 8000,
    randomize: true,
  });

  return new Promise((resolve, reject) => {
    operation.attempt(async (currentAttempt) => {
      try {
        const res = await fetch(url, { signal });
        if (res.status >= 500) throw new Error('upstream ' + res.status);
        resolve(await res.json());
      } catch (err) {
        if (operation.retry(err)) return;
        reject(operation.mainError());
      }
    });
  });
}

const data = await fetchWithRetry('https://api.example.com/pricing');
console.log('plans:', data.plans.length);