4. 多场景 SLO 识别:延迟型、错误率型、吞吐量型、饱和度型

SLO(Service Level Objective)是服务等级目标,是自愈触发策略的核心输入。不同业务场景关注的服务质量维度不同,对应的 SLO 类型也截然不同。本章将四种最常见的 SLO 类型进行结构化拆解,帮助你在 Runbook 参数化设计中准确识别并适配触发条件。

4.1 四种 SLO 类型总览

下表从定义、典型指标、适用场景、触发敏感度四个维度对比四种 SLO 类型,便于快速建立全局认知。

SLO 类型 核心定义 典型指标 适用场景 触发敏感度
延迟型 SLO 请求在指定时间内完成的比例 p50 / p95 / p99 延迟 API 网关、数据库查询、页面加载 高(毫秒级波动即触发)
错误率型 SLO 失败请求占总请求的比例 HTTP 5xx 率、异常率 支付、登录、核心写链路 极高(单点故障快速扩散)
吞吐量型 SLO 单位时间处理的请求量或数据量 QPS、TPS、BPS 消息队列、流处理、CDN 边缘 中(需结合容量基线)
饱和度型 SLO 资源使用接近上限的程度 CPU / 内存 / 磁盘 / 连接数使用率 基础设施、容器集群、数据库连接池 中低(需预留缓冲阈值)
设计提示: 一个微服务通常需要组合 2~3 种 SLO 类型才能覆盖完整健康面。例如,仅监控延迟而不监控错误率,可能遗漏“快速返回错误”的故障模式。

4.2 延迟型 SLO:响应时间的承诺边界

延迟型 SLO 定义的是“在多少毫秒内完成请求的比例”。常见的表述为:“99% 的请求在 200ms 内完成”。

  • 分位数选择: p50 反映典型体验,p95 反映长尾用户,p99 反映极端异常。Runbook 参数化时,建议将分位数作为可配置参数。
  • 窗口聚合: 延迟指标通常按 1 分钟 / 5 分钟窗口滑动计算,避免瞬时毛刺误触发。
  • 自愈触发条件: 当 p99 延迟连续 3 个窗口超过阈值,且错误率未同步上升时,优先触发扩容或缓存预热。
# 延迟型 SLO 参数化示例(YAML 片段)
slo_type: latency
metric: http_request_duration_seconds
aggregation: p99
window: 5m
threshold: 0.2  # 200ms
consecutive_buckets: 3
action: scale_up
关键避坑: 不要使用平均值作为延迟 SLO 指标。平均值会掩盖长尾问题,p99 或 p95 才是有效边界。

4.3 错误率型 SLO:故障的快速探测器

错误率型 SLO 衡量的是失败请求占总请求的百分比。它是自愈系统响应最快的触发信号,因为错误率上升通常意味着服务已经不可用或部分不可用。

  • 错误分类: 需要区分客户端错误(4xx)和服务端错误(5xx)。Runbook 通常只对 5xx 或业务自定义错误码触发自愈。
  • 基线对比: 错误率阈值应基于历史基线动态设定,而非固定值。例如“当前错误率超过基线 3 倍”作为触发条件。
  • 熔断联动: 错误率型 SLO 常与熔断器(Circuit Breaker)配合,在触发自愈前先隔离故障节点。
# 错误率型 SLO 参数化示例
slo_type: error_rate
metric: http_requests_total{status=~"5.."}
aggregation: rate_1m
window: 1m
threshold: 0.05  # 5% 错误率
baseline_mode: dynamic_3x
action: circuit_break
注意: 错误率型 SLO 的窗口不宜过长。超过 2 分钟的窗口可能导致故障扩散到整个集群。建议 1 分钟窗口 + 连续 2 次触发即执行自愈。

4.4 吞吐量型 SLO:容量与压力的平衡点

吞吐量型 SLO 关注的是服务在单位时间内能处理多少请求或数据。它不直接反映服务质量,但能揭示容量瓶颈和限流需求。

  • 指标类型: QPS(每秒查询数)、TPS(每秒事务数)、BPS(每秒字节数)。
  • 触发逻辑: 吞吐量下降通常意味着上游限流或下游阻塞;吞吐量突增则可能触发限流自愈。
  • 参数化要点: 吞吐量阈值必须与部署规模挂钩。例如“单实例 QPS 超过 5000”作为扩容触发条件,而非全局固定值。
# 吞吐量型 SLO 参数化示例
slo_type: throughput
metric: nginx_requests_per_second
aggregation: avg_1m
threshold: 5000
per_instance: true
action: scale_out
最佳实践: 吞吐量型 SLO 应配合饱和度指标一起使用。当吞吐量接近上限且资源使用率超过 70% 时,才是真正的扩容时机。

4.5 饱和度型 SLO:资源耗尽的前兆

饱和度型 SLO 衡量的是资源使用接近上限的程度。它是四种 SLO 中唯一不直接反映请求质量的类型,但却是基础设施自愈的核心依据。

  • 资源维度: CPU 使用率、内存使用率、磁盘 IO 等待、连接池使用率、文件描述符使用率。
  • 预留缓冲: 饱和度阈值通常设定在 70%~80%,预留 20%~30% 的缓冲空间应对突发流量。
  • 自愈动作: 资源饱和度触发后,自愈动作通常是垂直扩容、水平扩容或资源回收(如清理临时文件)。
# 饱和度型 SLO 参数化示例
slo_type: saturation
metric: node_cpu_utilization
aggregation: avg_5m
threshold: 0.8  # 80%
resource_type: cpu
action: scale_up_or_evict
设计提示: 饱和度型 SLO 的窗口应比其他类型更长(5~10 分钟),避免因瞬时资源抖动触发不必要的扩容。同时建议设置“持续上升趋势”作为辅助条件。

4.6 四种 SLO 的识别与选择矩阵

在实际 Runbook 设计中,你需要根据服务类型和故障模式选择 SLO 组合。下表给出了常见服务类型的推荐 SLO 组合。

服务类型 主 SLO 辅 SLO 说明
API 网关 延迟型 错误率型 网关是流量入口,延迟和错误率直接影响所有下游
数据库 饱和度型 延迟型 数据库瓶颈通常先表现为资源饱和,再体现为延迟上升
消息队列 吞吐量型 饱和度型 队列积压是吞吐量下降的直接表现,同时关注磁盘和内存
计算任务 吞吐量型 错误率型 批处理任务关注处理速度,失败任务需快速重试
CDN 边缘 延迟型 吞吐量型 边缘节点关注用户感知延迟和带宽使用率

4.7 四种 SLO 的触发关系图

下图展示了四种 SLO 类型在自愈系统中的触发关系与典型流转路径。理解这个关系图有助于你在 Runbook 中设计正确的触发优先级和联动逻辑。

四种 SLO 触发关系与自愈流转路径 延迟型 SLO p99 延迟 > 阈值 错误率型 SLO 5xx 率 > 基线 吞吐量型 SLO QPS 突降 / 突增 饱和度型 SLO 资源使用率 > 80% 关联 错误导致延迟上升 高吞吐推高资源使用 自愈引擎:SLO 触发判断与动作编排 扩容 / 缩容 水平或垂直 熔断 / 限流 隔离故障节点 缓存预热 / 降级 恢复服务质量 说明: 1. 延迟型与错误率型 SLO 通常同时触发,优先处理错误率。 2. 吞吐量型 SLO 下降时,需检查饱和度型 SLO 是否已达上限。 3. 饱和度型 SLO 是扩容动作的主要依据,建议预留 20% 缓冲。

4.8 多场景 SLO 参数化设计要点

在 Runbook 中实现多场景 SLO 自愈触发,需要将上述四种 SLO 类型抽象为可配置的参数模板。以下是参数化设计的核心要点:

  1. 指标源抽象: 将 Prometheus、Datadog、CloudWatch 等指标源封装为统一接口,Runbook 只关心 metric 名称和聚合方式。
  2. 阈值动态化: 支持固定阈值、基线倍数、百分位数三种阈值模式,通过参数 threshold_mode 切换。
  3. 窗口与连续性: 每个 SLO 类型独立配置 window 和 consecutive_buckets,避免误触发。
  4. 动作映射: 定义 SLO 类型到自愈动作的映射表,支持“一类型多动作”和“多类型一动作”两种模式。
  5. 优先级与抑制: 当多个 SLO 同时触发时,按错误率 > 延迟 > 饱和度 > 吞吐量的优先级执行,并支持抑制规则。
# 多场景 SLO 参数化模板(完整示例)
slo_definitions:
  - name: api_latency
    type: latency
    metric: http_request_duration_seconds
    aggregation: p99
    window: 5m
    consecutive: 3
    threshold_mode: fixed
    fixed_threshold: 0.2
    actions: [scale_up, cache_warm]

  - name: api_error_rate
    type: error_rate
    metric: http_requests_total{status=~"5.."}
    aggregation: rate_1m
    window: 1m
    consecutive: 2
    threshold_mode: baseline
    baseline_multiplier: 3
    actions: [circuit_break, alert]

  - name: db_saturation
    type: saturation
    metric: node_cpu_utilization
    aggregation: avg_5m
    window: 10m
    consecutive: 2
    threshold_mode: fixed
    fixed_threshold: 0.8
    actions: [scale_up, evict_pods]
总结: 四种 SLO 类型覆盖了服务质量(延迟、错误率)和容量健康(吞吐量、饱和度)两个维度。在 Runbook 参数化设计中,将它们统一为可配置的 SLO 定义块,是实现多场景自愈触发的基础。下一章将深入讲解如何将这些 SLO 定义与具体的自愈动作编排引擎对接。