跳到主要内容

SLI、SLO、错误预算与容量余量

SLI 用用户可感知的指标描述服务表现,SLO 为这些指标设定目标,错误预算和容量余量据此约束发布与资源决策。

1. 先确定服务和用户旅程

同一个系统可以同时服务在线请求、批处理任务和内部管理操作,它们对延迟和失败的容忍度不同。定义指标前先写清:

  • 服务对象是谁;
  • 哪条用户旅程需要保护;
  • 请求从哪里开始、到哪里算完成;
  • 哪些失败会真实影响用户;
  • 统计窗口和流量范围是什么。

例如“下单可用性”可以从网关收到合法下单请求开始,到用户得到明确的成功或业务拒绝为止。依赖超时导致的未知结果属于失败;库存不足这类正确业务拒绝不应计为系统错误。

2. SLI 定义好事件比例

请求型 SLI 常用好事件占有效事件的比例:

SLI = good events / valid events

可用性可以把成功响应作为好事件;延迟 SLI 可以把规定时间内完成的请求作为好事件,例如“下单请求中 99% 在 500 ms 内完成”。使用比例比平均值更能反映尾部体验。

一个完整 SLI 要说明:

  • 数据采集点,例如客户端、边缘网关或服务端;
  • 分子、分母和排除条件;
  • 延迟阈值或正确性判定;
  • 缺失数据如何处理;
  • 是否按地区、租户或请求类型分组。

优先在靠近用户的位置测量。只看服务进程返回成功,可能漏掉 DNS、网关和客户端链路中的失败。

3. SLO 包含目标和窗口

SLO 是 SLI 在一个时间窗口内需要达到的目标,例如:

过去 28 天内,99.9% 的有效下单请求得到正确结果。
过去 28 天内,99% 的商品查询在 300 ms 内完成。

滚动窗口能持续反映当前风险,日历月窗口便于业务结算。无论选择哪一种,都要统一报表、告警和发布策略的计算方式。

SLO 不宜直接照抄当前最好表现,也不应默认追求 100%。目标来自用户需求、替代方案、失败影响和实现成本。可以设置比外部承诺更严格的内部 SLO,为响应和变化留出缓冲。

4. 错误预算量化可接受失败

可用性 SLO 为 99.9% 时,错误预算是 0.1% 的有效事件。在请求型统计中,如果 28 天有一亿次有效请求,预算允许十万次失败。

请求型预算能反映流量差异;按停机时间换算更直观,但会忽略部分请求失败和流量高峰。两者可以同时展示,决策时以正式 SLI 为准。

错误预算需要配套策略,例如:

  • 预算充足时允许正常发布和试验;
  • 消耗速度异常时降低灰度速度并调查;
  • 预算耗尽时暂停普通变更,优先恢复可靠性;
  • 安全修复和直接降低故障风险的变更保留通道。

没有事先约定行动的错误预算只是一张报表。

5. 燃烧率用于提前告警

燃烧率表示当前错误预算消耗速度相对于允许速度的倍数。燃烧率为 1,表示保持当前速度会在窗口结束时恰好用完预算;燃烧率为 10,则会快十倍耗尽。

短窗口高燃烧率适合发现剧烈故障,长窗口中等燃烧率适合发现持续退化。多窗口告警可以同时要求短、长窗口超过阈值,减少瞬时抖动造成的误报。

告警应连接到用户 SLO 和明确响应动作。CPU 高但用户请求正常时,通常先进入容量或趋势告警;用户错误预算快速燃烧时,才需要立即通知值班人员。

6. 容量余量覆盖增长和故障

容量计划从需求预测和单实例能力开始:

所需容量 = 预测峰值负载 / 单位资源安全吞吐

单位资源安全吞吐要在满足延迟和错误率 SLO 的范围内通过压测得到,不能使用 CPU 已经饱和时的极限数字。

余量至少覆盖:

  • 正常流量增长与预测误差;
  • 发布期间新旧版本并存;
  • 一个故障域失效后的接管;
  • 自动扩容启动、预热和数据再平衡时间;
  • 突发流量与下游降速。

例如三个可用区按均衡方式承载流量,要求任一区故障后仍满足 SLO,就要按剩余两个区可以承接峰值来配置,而不是让正常状态下每个区都接近满载。

7. 依赖预算需要逐层分配

用户请求经过多个依赖时,整体可用性不会高于最薄弱的关键依赖。设计阶段要列出同步关键路径,确定每项依赖的超时、失败模式和目标。

可以通过缓存、降级、异步化和多供应商减少关键依赖,但这些措施会改变数据新鲜度和业务语义。每个降级结果都应明确是否算好事件,避免系统返回 200,用户却无法完成任务。

团队内部可以给子服务分配更严格的可靠性目标,为网关、网络和组合调用保留整体预算。目标无法满足时,应调整用户 SLO、架构或产品流程,而不是在报表中排除失败。

8. 常见问题

8.1 SLA 与 SLO 有什么区别

SLO 是团队管理服务的目标;SLA 是与用户或客户的协议,通常包含未达到目标后的明确后果。内部 SLO 可以比 SLA 更严格,提前触发工程行动。

8.2 所有接口是否共用一个 SLO

不建议。登录、支付和后台导出对用户的影响不同。按关键用户旅程划分少量 SLO,更容易做出资源和发布决策;为每个接口建立一套目标又会造成管理负担。

9. 面试题

9.1 怎样为一个核心服务制定 SLO 和容量余量

出现公司:阿里巴巴

考察重点

  • 用户旅程、SLI 分子分母和统计窗口。
  • 错误预算、燃烧率与发布策略。
  • 峰值、故障域、扩容时间和压测基线。

相关内容:第 1 节“先确定服务和用户旅程”至第 7 节“依赖预算需要逐层分配”。

参考回答

我会先选关键用户旅程,明确从哪里观测、什么算有效请求、什么结果算成功,再分别定义可用性和延迟 SLI。SLO 要包含目标和滚动窗口,目标由用户影响、业务风险和成本共同决定。SLO 剩余部分形成错误预算,并配套燃烧率告警和发布策略,让预算能改变行动。

容量方面先压测出满足 SLO 时的单实例安全吞吐,再结合峰值预测、增长误差、扩容预热、发布双跑和故障域失效计算余量。还要检查同步依赖的目标和降级语义。上线后用真实负载、预算消耗和扩容记录持续校准,避免把资源利用率或历史最好数据直接当目标。