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