2. SLO基础

在发布工程中,质量门禁不能依赖“感觉”或“经验”,必须由可量化的指标驱动。服务等级目标(SLO)正是这套量化体系的基石。本章将拆解 SLO 的定义、SLI 与 SLO 的映射关系,以及错误预算如何成为阻断低质量发布的数学依据。

2.1 服务等级指标(SLI)与服务等级目标(SLO)

SLI(Service Level Indicator) 是经过良好定义的、可测量的服务质量指标。常见的 SLI 包括请求延迟、错误率、吞吐量、饱和度等。SLO(Service Level Objective) 则是为 SLI 设定的目标阈值或范围,代表“用户可接受的服务质量下限”。

核心公式: SLO = SLI 的预期目标值(例如:99.9% 的请求在 200ms 内完成)。

SLI 与 SLO 的关系可以概括为:SLI 是“测量什么”,SLO 是“目标是多少”。没有 SLI,SLO 就是空谈;没有 SLO,SLI 就缺乏评判标准。

维度 SLI(服务等级指标) SLO(服务等级目标)
定义 可测量的服务质量原始数据 基于 SLI 设定的目标阈值
示例 P99 延迟 = 180ms P99 延迟 ≤ 200ms
粒度 原始时间序列数据(每秒/每分钟) 滚动窗口内的合规比例(如 30 天)
用途 监控、告警、趋势分析 质量门禁、错误预算计算、发布决策
变化频率 实时变化 相对稳定,按季度/版本评审
实践建议: 在发布工程中,建议为每个关键用户旅程(如“登录”、“下单”)定义 1-2 个核心 SLI,并设定对应的 SLO。过多的 SLO 会导致门禁过于敏感,过少则可能遗漏关键质量维度。

2.2 SLI 到 SLO 的映射流程

从原始指标到可执行的门禁目标,需要经过一个标准化的映射流程。下图展示了 SLI 采集、聚合、目标设定到门禁应用的完整链路。

SLI 到 SLO 映射流程 原始指标 延迟/错误率 吞吐量/饱和度 SLI 定义 聚合窗口 分位/均值 SLO 设定 目标阈值 合规窗口 门禁应用 阻断/放行 降级策略 说明: 每个步骤都需要明确的定义和可重复的自动化工具支持。SLI 定义阶段需要确定数据源、聚合方式和采样周期。 SLO 设定阶段需要与业务方对齐“可接受”与“不可接受”的边界。

2.3 错误预算的核心原理

错误预算(Error Budget) 是 SLO 的衍生概念,它量化了服务在给定时间窗口内“允许失败”的总量。其核心公式为:

错误预算 = 1 - SLO(以小数表示)
例如:SLO = 99.9% → 错误预算 = 0.1% 的总时间或请求量

错误预算的消耗速度直接决定了发布是否应该被阻断。当错误预算消耗过快(接近或超过阈值)时,发布工程平台应自动触发门禁,阻止任何可能进一步消耗预算的变更。

关键认知: 错误预算不是“可以随意浪费的额度”,而是“风险容量的上限”。在发布工程中,错误预算的剩余量决定了发布的“风险预算”。剩余越多,发布越激进;剩余越少,发布越保守。

2.4 错误预算驱动的发布决策模型

下表展示了不同错误预算剩余状态下,发布工程自助门户应采取的默认策略:

错误预算剩余 风险等级 发布策略 门禁行为
> 50% 低风险 正常发布,可执行金丝雀+自动晋升 仅基础检查(编译/单元测试)
20% - 50% 中风险 谨慎发布,金丝雀时间延长 2x 触发 SLI 实时对比门禁
5% - 20% 高风险 仅允许紧急修复(hotfix) 需要 SRE 手动审批 + 全量 SLI 检查
< 5% 严重 冻结所有发布 自动阻断,仅允许回滚操作

下图展示了错误预算的消耗与恢复周期,以及门禁在不同阶段的介入点:

错误预算消耗与门禁介入点 T0 T1 T2 T3 T4 预算 100% 消耗 30% 消耗 80% → 门禁触发 恢复至 60% 恢复至 90% 发布冻结区 当错误预算消耗超过 75%(即剩余不足 25%)时,发布工程门户应自动进入“谨慎模式”;超过 95% 时进入“冻结模式”。

2.5 错误预算的恢复机制

错误预算并非只减不增。在滚动时间窗口(通常为 30 天)内,随着时间推移,旧的失败记录会逐渐移出窗口,从而恢复预算。理解这一点对于设计门禁策略至关重要:

  • 滚动窗口恢复: 默认使用 30 天滑动窗口,每天移出第 31 天的数据,移入当天数据。
  • 主动恢复: 通过回滚有问题的发布、扩容、优化代码等方式降低失败率,加速预算恢复。
  • 门禁自愈: 当错误预算恢复到安全阈值(如 > 50%)以上时,门禁应自动解除阻断状态,允许正常发布流程继续。
发布工程最佳实践: 错误预算的恢复不应被视为“可以继续犯错”的信号。建议在门禁设计中加入“冷却期”(Cool-down Period),即使预算恢复,也至少等待 1 小时才能执行下一次发布,避免频繁触发门禁导致发布流水线震荡。