3. 服务目录水位定义

3.1 什么是服务目录水位?

服务目录水位(Service Catalog Water Level)是一个量化指标集合,用于描述某个服务在可靠性、健康度、变更风险三个维度上的当前状态。它类似于一个“仪表盘”,让平台和团队能够快速判断一个服务是否处于“安全可变更”的状态。

在 Backstage 的上下文中,服务目录水位是变更门禁和回滚判断的核心数据源。当水位过高(即风险指标超标)时,系统会自动阻止新的变更进入生产环境,或触发自动回滚流程。

核心定义:服务目录水位 = f(健康分, SLO达成率, 错误预算消耗) —— 一个由多个可靠性指标加权计算得出的综合风险评分。
服务目录水位模型 健康分 SLO 达成率 错误预算消耗 水位计算引擎 水位等级 (低/中/高/严重)

3.2 水位指标的选取原则

选择哪些指标来构成服务目录水位,直接决定了门禁和回滚判断的准确性。以下是经过生产验证的三大核心指标及其选取原则:

指标名称 选取原则 权重建议 数据来源
健康分 综合反映服务的基础运行状态,包括 CPU/内存使用率、错误率、延迟 P99 等。选取原则:全面性——覆盖基础设施、应用、中间件三个层面。 40% 监控系统 (Prometheus/Datadog)
SLO 达成率 衡量服务在过去一个时间窗口(如 7 天/30 天)内是否满足用户承诺的可用性目标。选取原则:用户视角——只选取直接影响用户体验的 SLI。 35% SLO 跟踪平台 (Backstage SLO Plugin)
错误预算消耗 反映当前错误预算的剩余比例和消耗速度。选取原则:趋势性——不仅看当前值,还要看过去 1 小时的消耗速率。 25% 错误预算计算器
最佳实践:不要试图把所有指标都塞进水位的计算中。选取 3-5 个最核心的指标,并定期(如每季度)根据实际效果调整权重。指标过多会导致水位变化过于敏感,反而降低门禁的有效性。

3.3 水位等级与门禁策略

根据上述三个指标的综合计算,服务目录水位被划分为四个等级。每个等级对应不同的变更门禁策略:

水位等级 综合评分范围 变更门禁策略 回滚触发条件
低水位 0 - 30 允许所有变更 不触发自动回滚
中水位 31 - 60 允许变更,但需人工审批 仅当水位在变更后 5 分钟内上升超过 20 分时触发
高水位 61 - 85 禁止变更,仅允许紧急修复 变更后水位上升超过 10 分立即回滚
严重水位 86 - 100 完全锁定,禁止任何变更 自动回滚最近一次变更
水位等级与门禁策略流程 低水位 (0-30) 中水位 (31-60) 高水位 (61-85) 严重水位 (86-100) 允许所有变更 不触发自动回滚 需人工审批 5min 内上升 >20 分 触发回滚 仅允许紧急修复 上升 >10 分立即回滚 完全锁定 自动回滚最近变更 水位越高,变更门禁越严格,回滚触发条件越敏感

3.4 指标计算示例

假设有一个名为 order-service 的服务,其当前水位计算过程如下:

# 健康分计算
健康分 = (CPU使用率得分 * 0.3) + (错误率得分 * 0.4) + (P99延迟得分 * 0.3)
       = (80 * 0.3) + (60 * 0.4) + (70 * 0.3)
       = 24 + 24 + 21
       = 69

# SLO 达成率
SLO 达成率 = 过去 7 天满足 SLO 的时间比例 = 95%

# 错误预算消耗
错误预算消耗 = (已消耗错误预算 / 总错误预算) * 100 = 45%

# 综合水位评分
水位评分 = (健康分 * 0.4) + ((100 - SLO达成率) * 0.35) + (错误预算消耗 * 0.25)
         = (69 * 0.4) + (5 * 0.35) + (45 * 0.25)
         = 27.6 + 1.75 + 11.25
         = 40.6  → 中水位
注意:上述示例中的权重和计算公式仅为演示用途。在实际生产环境中,你需要根据服务的业务重要性和历史故障模式来调整权重。例如,对于核心支付服务,错误预算消耗的权重可能需要提高到 40% 以上。

3.5 水位数据的存储与同步

在 Backstage 中,服务目录水位数据通常存储在自定义实体关系模型中,并通过以下方式保持实时同步:

  • 数据源:Prometheus、Datadog、Grafana 等监控系统
  • 同步频率:每 1 分钟拉取一次指标数据
  • 存储方式:Backstage Catalog 的 metadata.annotations 字段
  • 更新机制:通过 Backstage 的 EntityProvider 接口实现增量更新
# Backstage 实体 YAML 示例(水位数据存储在 annotations 中)
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: order-service
  annotations:
    reliability.water-level/score: "40.6"
    reliability.water-level/level: "medium"
    reliability.water-level/health-score: "69"
    reliability.water-level/slo-achievement: "95"
    reliability.water-level/error-budget-consumed: "45"
    reliability.water-level/updated-at: "2025-03-15T10:30:00Z"
spec:
  type: service
  lifecycle: production
  owner: team-payment

通过这种方式,Backstage 可以在变更门禁插件中直接读取水位数据,无需额外的 API 调用,从而实现毫秒级的门禁判断。