概述

很多团队在实践 SRE 时遇到的第一个困境是:知道 SLO 是什么,但不知道怎么设。要么照搬 Google 的 99.99%,要么随便拍一个 99.9%——然后发现这个数字既不反映用户体验,也无法驱动工程决策。

好的 SLO 不是拍脑袋拍出来的,而是从业务目标出发,经过用户旅程分析、指标选择、数值校准、多层级设计、定期评审等一系列工程方法推导出来的。详细梳理 SLO 设计的完整方法论,帮助你建立从"业务目标"到"技术指标"的完整映射链路。

本文假设读者已了解 SLI/SLO 的基本概念。如需补充,可参考 Google SRE Workbook - Service Level Objectives 和本站 SRE核心理念:SLI、SLO与错误预算

一、SLO 设计金字塔

SLO 设计不是孤立的技术活动,而是从上到下的分层推导过程:

            ┌─────────────┐
            │  业务目标    │  "我们的服务需要做到什么程度?"
            └──────┬──────┘
            ┌──────▼──────┐
            │  用户体验    │  "用户关心什么?"
            └──────┬──────┘
            ┌──────▼──────┐
            │   SLI 定义   │  "我们怎么衡量用户体验?"
            └──────┬──────┘
            ┌──────▼──────┐
            │  SLO 目标值  │  "这个指标要做到多少?"
            └──────┬──────┘
            ┌──────▼──────┐
            │  告警与行动  │  "不达标时怎么办?"
            └─────────────┘

第一层:业务目标

一切 SLO 设计的起点是业务目标,而不是技术指标。业务目标回答的问题是:这个服务对业务的价值是什么?

业务类型业务目标对 SLO 的影响
电商支付交易成功率直接影响营收SLO 必须极高(99.99%+)
内容推荐延迟影响用户留存延迟 SLO 优先级高于可用性
内部工具影响员工效率SLO 可以适当宽松(99.5%)
合规审计数据不可丢失正确性 SLO 优先

第二层:用户体验

从业务目标推导出用户关心的体验维度。用户不关心你的 CPU 使用率,只关心:

  • 服务能不能用?(可用性)
  • 服务快不快?(延迟)
  • 服务返回的结果对不对?(正确性)
  • 服务能处理多少流量?(容量/吞吐)

第三层:SLI 定义

把用户体验转化为可度量的技术指标。

第四层:SLO 目标值

为每个 SLI 设定目标值,并计算错误预算。

第五层:告警与行动

SLO 不是用来展示的,是用来驱动行动的。每个 SLO 都必须有对应的告警策略和行动方案。

二、用户旅程到 SLI 的映射

用户旅程分析

SLO 设计中最关键的一步是从用户视角定义 SLI。不是"我的服务 P99 延迟是多少",而是"用户感受到的体验是什么"。

用户旅程分析的方法:

用户旅程:电商下单

  浏览商品 → 加入购物车 → 提交订单 → 支付 → 确认

  每一步都映射到一个或多个 SLI:
  
  浏览商品:
    - SLI: 商品页面加载成功率 > 99.95%
    - SLI: 商品页面 P95 加载时间 < 500ms

  加入购物车:
    - SLI: 购物车操作成功率 > 99.9%
    - SLI: 购物车操作 P99 延迟 < 200ms

  提交订单:
    - SLI: 订单提交成功率 > 99.99%
    - SLI: 订单提交 P99 延迟 < 1s

  支付:
    - SLI: 支付成功率 > 99.99%
    - SLI: 支付 P99 延迟 < 2s

关键用户旅程(Critical User Journey, CUJ)

不是所有用户旅程都需要 SLO。应该聚焦在关键用户旅程上——对业务价值最大、用户最敏感的路径。

# CUJ 优先级矩阵
user_journeys:
  - name: "用户登录"
    business_value: "high"       # 登录失败 → 用户直接流失
    user_sensitivity: "high"     # 用户对登录失败零容忍
    priority: P0
    needs_slo: true

  - name: "商品搜索"
    business_value: "high"       # 搜索影响转化率
    user_sensitivity: "medium"   # 搜索稍慢可以接受
    priority: P1
    needs_slo: true

  - name: "查看订单历史"
    business_value: "medium"
    user_sensitivity: "low"
    priority: P2
    needs_slo: false             # 可用默认 SLO 覆盖

SLI 的规范定义

一个好的 SLI 定义需要包含五个要素:

# SLI 规范定义模板
sli_spec:
  name: "支付请求成功率"
  
  # 1. 测量对象
  subject: "payment-service"
  
  # 2. 测量维度
  metric: "成功率"
  
  # 3. 计算方式
  formula: |
    成功请求数 / 总请求数
    成功定义: HTTP 状态码不在 [500, 599] 区间
    排除: 客户端错误 (4xx)、健康检查请求 (/healthz)    
  
  # 4. 测量窗口
  window: "30d"
  
  # 5. 数据来源
  source: "Prometheus http_requests_total metric"

常见 SLI 模式

SLI 类型计算方式适用场景
可用性成功请求数 / 总请求数所有面向用户的服务
延迟P99/P95 响应时间所有交互式服务
吞吐量QPS / TPS批处理、数据管道
正确性数据校验通过率数据存储、消息队列
新鲜度数据更新时间 < N 分钟缓存、索引、报表
覆盖率已索引数据 / 总数据搜索引擎
耐久性未丢失数据 / 总数据对象存储、数据库

SLI 定义的常见错误

错误一:用资源指标当 SLI

# ❌ 错误:CPU 使用率不是 SLI
sli:
  metric: "CPU 使用率 < 80%"
  why_wrong: "CPU 80% 时用户可能完全无感知,也可能已经严重影响延迟"

# ✅ 正确:从用户视角定义
sli:
  metric: "请求 P99 延迟 < 200ms"
  why_right: "直接反映用户感受到的体验"

错误二:聚合粒度过粗

# ❌ 错误:全局成功率
sli:
  metric: "所有 HTTP 请求成功率 > 99.9%"
  why_wrong: "健康检查请求和支付请求混在一起,掩盖了关键路径的问题"

# ✅ 正确:按关键路径分别定义
sli:
  metric: "支付 API 成功率 > 99.99%"
sli:
  metric: "商品 API 成功率 > 99.9%"

错误三:只看平均值

# ❌ 错误:平均延迟
sli:
  metric: "平均延迟 < 100ms"
  why_wrong: "平均延迟掩盖了长尾——1% 的用户可能等了 5 秒"

# ✅ 正确:使用百分位
sli:
  metric: "P99 延迟 < 200ms"
sli:
  metric: "P95 延迟 < 100ms"

三、SLO 数值设定方法论

SLO 设定的核心原则

SLO 应该设定在"用户开始注意到问题"的阈值之上,但不要设定得太高以至于没有错误预算可用。

这意味着 SLO 有两个边界约束:

  • 下限:低于用户容忍度 → 用户体验差 → 影响业务
  • 上限:高于实际能力 → 没有错误预算 → 无法发布新功能

基于 historical data 的 SLO 校准

最可靠的 SLO 设定方法是基于历史数据:

# SLO 校准分析
def calibrate_slo(historical_sli_data, user_satisfaction_threshold):
    """
    historical_sli_data: 过去 90 天的 SLI 数据
    user_satisfaction_threshold: 用户满意度阈值
    """
    # 1. 计算历史 SLI 分布
    p50 = percentile(historical_sli_data, 50)
    p90 = percentile(historical_sli_data, 90)
    p99 = percentile(historical_sli_data, 99)
    p999 = percentile(historical_sli_data, 99.9)
    
    # 2. 找到用户满意度的拐点
    # 用户满意度突然下降的 SLI 值就是 SLO 的下限
    satisfaction_inflection = find_inflection_point(
        historical_sli_data, 
        user_satisfaction_threshold
    )
    
    # 3. SLO 设定在拐点之上,留出安全余量
    suggested_slo = satisfaction_inflection * 1.1  # 10% 安全余量
    
    return {
        "historical_p50": p50,
        "historical_p99": p99,
        "satisfaction_inflection": satisfaction_inflection,
        "suggested_slo": suggested_slo,
        "error_budget": 1 - suggested_slo
    }

SLO 数值选择指南

SLO 目标错误预算/月适用场景设定条件
99%432 分钟内部工具、非关键服务容忍较高不可用率
99.5%216 分钟后台服务、批处理适度可用性要求
99.9%43.2 分钟一般面向用户的服务大多数服务的默认选择
99.95%21.6 分钟重要业务服务有冗余和自动故障转移
99.99%4.3 分钟核心业务服务多活架构、完善的自愈
99.999%0.43 分钟极少数关键服务通常不现实,成本极高

设定 SLO 的决策流程

Step 1: 确定服务的业务等级
  → L1 核心 / L2 重要 / L3 一般 / L4 辅助

Step 2: 分析历史数据
  → 过去 90 天的 SLI 表现如何?
  → P50 / P95 / P99 分布如何?

Step 3: 识别用户容忍度
  → 用户在什么 SLI 水平下开始投诉?
  → 历史上 SLI 降到多少时业务指标受影响?

Step 4: 选择初始 SLO
  → 基于历史 P99 或 P99.9 表现,设定略高于当前水平的目标
  → 留出足够的错误预算用于发布和创新

Step 5: 试运行验证
  → 设定 4-6 周的试运行期
  → 观察是否可行、是否反映真实用户体验

Step 6: 正式发布与定期评审
  → 试运行通过后正式生效
  → 每月/每季度评审 SLO 合理性

SLO 的初始设定策略

对于没有历史数据的新服务:

# 新服务 SLO 初始设定策略
new_service_slo_strategy:
  phase_1: "试运行期(前 4 周)"
    action: "只监控不设 SLO,收集基线数据"
    goal: "了解 SLI 的自然分布"
    
  phase_2: "初始 SLO(第 5-8 周)"
    action: "基于基线数据设定保守的 SLO"
    strategy: |
      可用性 SLO = 历史最低可用性 + 0.5%
      延迟 SLO = 历史 P99 × 1.2      
    goal: "验证 SLO 的可行性"
    
  phase_3: "正式 SLO(第 9 周起)"
    action: "根据试运行数据调整并正式发布"
    review_cycle: "每月评审"

四、SLO 评审流程

为什么需要定期评审

SLO 不是一成不变的。以下情况需要重新评审 SLO:

  1. 用户期望变化:用户对延迟的容忍度可能随着竞品提升而降低
  2. 业务优先级变化:原来不重要的功能可能变成核心功能
  3. 技术架构变化:从单机到分布式、从同步到异步,SLO 需要相应调整
  4. SLO 过于宽松:长期不消耗错误预算,说明 SLO 可以收紧
  5. SLO 过于严格:错误预算总是不够用,说明 SLO 需要放松或需要投入改进

评审内容

# SLO 季度评审模板

## 评审范围
- 服务名称:payment-service
- 评审周期:2026 Q2
- 参与者:SRE 负责人、服务负责人、产品经理

## 当前 SLO
| SLI | SLO 目标 | 实际表现 | 错误预算消耗 |
|-----|---------|---------|-------------|
| 可用性 | 99.95% | 99.97% | 40% |
| 延迟(P99) | <200ms | 185ms | 25% |
| 延迟(P95) | <100ms | 92ms | 10% |

## 评审问题

### 1. SLO 是否反映了用户体验?
- [ ] 用户投诉量是否与 SLO 违规相关
- [ ] 是否有用户感知到的问题未被 SLI 覆盖
- 分析3 月的一次延迟劣化未被 P99 SLO 捕获但用户有投诉
   需要增加 P95 延迟 SLI 

### 2. SLO 是否过于宽松或严格?
- [ ] 错误预算是否总是用完?→ 消耗 40%
- [ ] 错误预算是否总是剩余很多?→ 可用性预算消耗 40%,延迟预算消耗 25%
- 分析延迟 SLO 消耗较低可以考虑收紧
   延迟 P99 SLO  200ms 收紧到 180ms 

### 3. 是否需要新增或删除 SLI?
- [ ] 是否有新的关键用户旅程需要覆盖
- [ ] 是否有不再相关的 SLI
- 分析新增了"支付回调延迟"SLI覆盖支付链路的异步部分
   新增 SLI: 支付回调 P99 < 5s 

### 4. SLO 的成本是否合理?
- [ ] 维持当前 SLO 的基础设施成本是多少
- [ ] 提升 SLO 到下一级的成本是多少
- 分析 99.95% 提升到 99.99% 需要多活架构成本增加 200%
   暂不提升当前 SLO 已满足业务需求 

## 评审结论
- 可用性 SLO维持 99.95%
- 延迟 P99 SLO 200ms 收紧到 180ms
- 新增延迟 P95 SLO:<100ms
- 新增支付回调 SLOP99 < 5s
- 下次评审2026 Q3

SLO 评审的决策树

错误预算消耗率
  ├─ < 25%(长期)
  │   → SLO 可能过于宽松
  │   → 评估是否收紧 SLO
  │   → 或利用富裕预算做创新
  ├─ 25-75%
  │   → SLO 合理
  │   → 维持当前 SLO
  └─ > 75%(长期)
      → SLO 可能过于严格
      → 评估是否放松 SLO
      → 或投入资源提升系统能力

五、多层级 SLO

为什么需要多层级

单一层级的 SLO 无法同时满足"反映用户体验"和"指导技术决策"的需求。用户关心的是"下单是否成功",运维关心的是"数据库连接池是否够用"——两者需要不同层级的 SLO 来连接。

三层 SLO 架构

┌──────────────────────────────────────────────────┐
│  用户体验级 SLO(User Experience SLO)              │
│  "用户能不能顺畅地完成关键操作?"                    │
│  → 从用户视角定义,面向业务                         │
└───────────────────────┬──────────────────────────┘
                        │ 分解
┌───────────────────────▼──────────────────────────┐
│  服务级 SLO(Service SLO)                         │
│  "每个服务是否满足其接口契约?"                     │
│  → 从服务间调用视角定义,面向开发                   │
└───────────────────────┬──────────────────────────┘
                        │ 分解
┌───────────────────────▼──────────────────────────┐
│  资源级 SLO(Resource SLO)                        │
│  "底层资源是否健康?"                              │
│  → 从基础设施视角定义,面向 SRE/运维               │
└──────────────────────────────────────────────────┘

用户体验级 SLO

# 用户体验级 SLO 示例:电商下单
user_experience_slo:
  journey: "用户下单"
  
  sli_1:
    name: "下单成功率"
    formula: "成功下单数 / 下单请求数"
    target: 99.99%
    window: 30d
    user_impact: "下单失败直接导致交易损失"
    
  sli_2:
    name: "下单端到端延迟"
    formula: "从点击'提交订单'到看到'下单成功'页面的时间"
    target: "P95 < 2s, P99 < 5s"
    window: 30d
    user_impact: "延迟超过 5s 用户可能放弃"
    
  sli_3:
    name: "下单页面可用性"
    formula: "商品页面成功加载次数 / 总访问次数"
    target: 99.95%
    window: 30d
    user_impact: "页面打不开用户直接流失"

服务级 SLO

# 服务级 SLO 示例:订单服务
service_slo:
  service: "order-service"
  
  sli_1:
    name: "API 可用性"
    formula: |
      非 5xx 响应数 / 总请求数
      排除: /healthz, /metrics      
    target: 99.95%
    window: 30d
    
  sli_2:
    name: "API 延迟"
    formula: "P99 响应时间"
    target: "< 500ms"
    window: 30d
    breakdown:
      - endpoint: "POST /api/orders"
        target: "P99 < 1s"
      - endpoint: "GET /api/orders/{id}"
        target: "P99 < 200ms"
      - endpoint: "GET /api/orders"
        target: "P99 < 500ms"
        
  sli_3:
    name: "消息处理延迟"
    formula: "消息从入队到处理完成的时间"
    target: "P99 < 10s"
    window: 30d

资源级 SLO

# 资源级 SLO 示例:数据库
resource_slo:
  resource: "order-db (PostgreSQL)"
  
  sli_1:
    name: "数据库可用性"
    formula: "可成功执行 SELECT 1 的时间 / 总时间"
    target: 99.99%
    window: 30d
    
  sli_2:
    name: "查询延迟"
    formula: "P99 查询执行时间"
    target: "< 50ms"
    window: 30d
    
  sli_3:
    name: "复制延迟"
    formula: "从库 lag"
    target: "< 1s"
    window: 30d
    
  sli_4:
    name: "连接池健康"
    formula: "可用连接数 / 总连接数"
    target: "> 30%"
    window: 5m   # 资源级 SLO 通常用更短的窗口

层级间的关联与分解

三个层级的 SLO 不是独立的,而是有因果关联:

用户体验级:下单成功率 99.99%
    ↑ 依赖
服务级:订单 API 成功率 99.95% + 支付 API 成功率 99.99%
    ↑ 依赖
资源级:数据库可用性 99.99% + 缓存可用性 99.95%

关键原则:下层 SLO 的达成是上层 SLO 达成的前提,但不是充分条件。

数据库可用 99.99% 不等于下单成功率 99.99%——中间还有应用层逻辑、网络、缓存等多个环节。因此每一层都需要独立定义 SLO。

SLO 级联告警

# SLO 级联告签示例
cascade_alerting:
  # 资源级告警:提前预警
  - level: resource
    condition: "数据库连接池使用率 > 80%"
    action: "通知 SRE,不通知业务团队"
    purpose: "在影响服务级 SLO 之前介入"
    
  # 服务级告警:影响正在发生
  - level: service
    condition: "订单 API 错误率 > 0.1%"
    action: "通知 SRE + 服务负责人"
    purpose: "防止影响用户体验级 SLO"
    
  # 用户体验级告警:用户已受影响
  - level: user_experience
    condition: "下单成功率 < 99.99%"
    action: "立即 page,通知全团队 + 管理层"
    purpose: "用户已感知到问题,必须立即恢复"

六、SLO 文档化

SLO 文档模板

每个服务的 SLO 应该有完整的文档记录:

# Service SLO: payment-service

## 服务概述
- 服务名称:payment-service
- 业务等级:L1(核心)
- 负责团队:支付团队 + SRE 平台团队
- SLO 评审周期:每季度

## 关键用户旅程
1. 用户发起支付 → 支付处理 → 返回结果
2. 支付回调 → 订单状态更新 → 通知用户

## SLI 与 SLO

### SLI-1: 支付 API 可用性
- 定义:非 5xx 响应 / 总请求(排除 /healthz)
- SLO:99.99%(30天窗口)
- 错误预算:4.3 分钟/月
- 数据来源:Prometheus http_requests_total

### SLI-2: 支付 API 延迟
- 定义:P99 响应时间
- SLO:< 2s30天窗口
- 数据来源Prometheus http_request_duration_seconds

### SLI-3: 支付成功率
- 定义支付成功数 / 支付发起数
- SLO99.95%(30天窗口
- 数据来源业务日志 + 数据库统计

## 告警策略
- 快速消耗1h 窗口消耗速率 > 14x → 立即 page
- 慢速消耗:6h 窗口消耗速率 > 6x → 工单跟踪
- 预算耗尽:月度预算 100% → 冻结发布

## 依赖关系
- 上游依赖:order-service, user-service
- 下游依赖:payment-db, redis-cluster, 第三方支付网关
- 共享基础设施:API Gateway, Load Balancer

## 历史记录
| 日期 | 变更 | 原因 |
|------|------|------|
| 2026-04-01 | 可用性 SLO 从 99.95% 提升到 99.99% | 业务要求 |
| 2026-05-15 | 新增支付回调延迟 SLI | 覆盖异步链路 |
| 2026-07-01 | 延迟 SLO 从 2.5s 收紧到 2s | 历史表现优于 SLO |

七、实战案例

案例一:为搜索服务设计 SLO

背景:一个电商搜索服务,日均 5000 万次查询,用户对搜索速度敏感。

Step 1:业务目标分析

搜索是用户进入商品详情页的前置环节
  → 搜索慢 → 用户放弃浏览 → 交易损失
  → 搜索无结果 → 用户流失
业务目标:搜索体验直接影响 GMV

Step 2:用户旅程分析

用户输入关键词 → 搜索请求 → 返回结果 → 用户点击商品

关键体验维度:
  1. 搜索是否可用(可用性)
  2. 搜索是否够快(延迟)
  3. 搜索结果是否相关(正确性/相关性)
  4. 搜索是否有结果(覆盖率)

Step 3:SLI 定义

search_service_sli:
  sli_1:
    name: "搜索 API 可用性"
    formula: "非 5xx 搜索响应 / 总搜索请求"
    target: 99.95%
    
  sli_2:
    name: "搜索 P99 延迟"
    formula: "P99(搜索响应时间)"
    target: "< 300ms"
    
  sli_3:
    name: "搜索 P95 延迟"
    formula: "P95(搜索响应时间)"
    target: "< 100ms"
    
  sli_4:
    name: "零结果率"
    formula: "返回 0 条结果的搜索 / 总搜索"
    target: "< 5%"
    note: "零结果率反映搜索质量,不是技术指标但影响用户体验"

Step 4:SLO 校准

# 基于历史数据校准
historical_data = {
    "availability_p50": 99.98,
    "availability_p99": 99.93,
    "latency_p99_avg": 250,  # ms
    "latency_p99_max": 450,  # ms
    "zero_result_rate_avg": 3.2,  # %
}

# SLO 设定
slo = {
    "availability": 99.95,       # 略低于 P50,留出预算
    "latency_p99": 300,          # 略高于平均,可达成
    "latency_p95": 100,          # 较严格,驱动优化
    "zero_result_rate": 5,       # 允许一定比例的零结果
}

案例二:微服务 SLO 的层级分解

背景:一个有 15 个微服务的电商平台,需要从整体到各服务建立 SLO 体系。

层级分解

平台级 SLO(面向用户)
  ├── 下单成功率 > 99.9%
  ├── 搜索可用性 > 99.95%
  └── 支付成功率 > 99.95%
      ├── order-service SLO
      │   ├── API 可用性 > 99.95%
      │   └── API P99 < 500ms
      │       │
      │       ├── order-db SLO
      │       │   ├── 可用性 > 99.99%
      │       │   └── 查询 P99 < 50ms
      │       │
      │       └── redis SLO
      │           ├── 可用性 > 99.95%
      │           └── 命中率 > 90%
      ├── payment-service SLO
      │   └── ...
      └── inventory-service SLO
          └── ...

关键决策:每个服务的 SLO 目标应该严于其支撑的平台级 SLO。因为多个服务的误差会叠加:

平台级:下单成功率 99.9%
  = order-service(99.95%) × payment-service(99.95%) × inventory-service(99.95%)
  = 0.9995^3 = 0.9985 = 99.85%
  → 不满足 99.9% 的平台级 SLO!
  
  需要:每个服务至少 99.97% → 0.9997^3 = 0.9991 = 99.91% ✅

八、SLO 工具链

SLO 监控与可视化

# Prometheus + Grafana SLO 监控
slo_monitoring:
  prometheus_rules:
    # SLO 达成率
    - record: slo:availability:rate30d
      expr: |
        sum(rate(http_requests_total{status!~"5.."}[30d]))
        /
        sum(rate(http_requests_total[30d]))        
    
    # 错误预算消耗
    - record: slo:error_budget:consumed:rate30d
      expr: |
        1 - (slo:availability:rate30d / 0.9999)        
    
    # 剩余错误预算
    - record: slo:error_budget:remaining:ratio
      expr: |
        1 - (slo:error_budget:consumed:rate30d / (1 - 0.9999))        
  
  grafana_dashboards:
    - "SLO 概览看板"
      panels:
        - "当前 SLI 值 vs SLO 目标"
        - "错误预算消耗趋势"
        - "SLO 达成历史"
        - "按服务分组的 SLO 状态"

SLO 即代码

# slo-spec.yaml - SLO 规范即代码
apiVersion: sre/v1
kind: ServiceSLO
metadata:
  name: payment-service-slo
  service: payment-service
spec:
  window: 30d
  targets:
    - name: availability
      sli:
        source: prometheus
        query: |
          sum(rate(http_requests_total{service="payment",status!~"5.."}[{{.window}}]))
          /
          sum(rate(http_requests_total{service="payment"}[{{.window}}]))          
      slo: 0.9999
      alerts:
        - burn_rate: 14
          window: 1h
          severity: page
        - burn_rate: 6
          window: 6h
          severity: ticket
          
    - name: latency_p99
      sli:
        source: prometheus
        query: |
          histogram_quantile(0.99,
            sum(rate(http_request_duration_seconds_bucket{service="payment"}[{{.window}}])) by (le)
          )          
      slo: 2.0
      comparison: less_than

总结

SLO 设计是一个从业务目标到技术指标的完整工程方法。核心要点:

  1. 从业务出发:SLO 的起点是业务目标,不是技术指标。先问"业务需要什么",再问"技术怎么衡量"。
  2. 用户旅程驱动:通过关键用户旅程(CUJ)分析,从用户视角定义 SLI,确保 SLO 反映真实用户体验。
  3. 数据校准:基于历史数据设定 SLO,避免拍脑袋。用试运行验证可行性,用定期评审持续优化。
  4. 多层级设计:用户体验级 → 服务级 → 资源级,三层 SLO 互相关联又各自独立。
  5. 驱动行动:SLO 的价值在于驱动决策——错误预算消耗策略、发布管控、改进优先级。不被使用的 SLO 等于没有 SLO。

好的 SLO 体系有以下几个标志:

  • SLO 能反映用户真实体验——用户投诉时 SLO 一定亮红灯
  • 错误预算能驱动发布决策——团队信任并依赖预算状态
  • SLO 有层级关联——下层 SLO 异常能提前预警上层 SLO 风险
  • SLO 持续演进——每个季度都有评审和调整

最后记住:SLO 不是目标,而是工具。它的价值不在于那个数字本身,而在于它驱动了多少有价值的工程决策。

参考资料与致谢

本文在撰写过程中参考了以下资料,感谢原作者的贡献:

  1. Google SRE Workbook - Service Level Objectives — Google SRE 团队,参考了Google SRE Workbook - Service Level Objectives相关内容