Skip to content

SLO 与稳定性工程 ​

定位:金融级稳定性方法论(1/6)。"系统要稳定"是口号,"放款成功率月度 SLO 99.95%、错误预算烧完就冻结发布"才是工程承诺。本篇写四件事。一是可用性每个 9 的代价曲线。二是 SLI 怎么从黄金信号推到业务指标。三是错误预算怎么与发布刹车联动。四是信贷场景为什么按"资损优先级"定级而不是只看可用性。同系列:容量账本见 容量规划与全链路压测,故障现场的三个动作见 应急预案三板斧-限流降级切流。故障的主动验证见 混沌工程与故障演练;指标采集的底层设施见 观测性三件套。

一、代价曲线:每个 9 都比上一个贵得多 ​

可用性年不可用月不可用达标需要的典型架构边际代价
99%(2 个 9)3.65 天7.3 小时单机房,无冗余低:正常开发
99.9%(3 个 9)8.76 小时43.8 分钟主备部署、人工切换中:冗余资源 + 值班
99.99%(4 个 9)52.6 分钟4.3 分钟同城双活、切换自动化高:全链路预案自动化
99.999%(5 个 9)5.3 分钟26 秒两地三中心/单元化多活极高:组织级投入
 成本
  │                                                   ____
  │                                            ______/ 5个9
  │                                    _____  /  单元化+多活+全自动化
  │                             ____  /    4个9   组织级投入
  │                      ____  /   3个9
  │               ____  /        冗余资源+预案自动化
  │        ____  /  2个9  主备+人工值班
  │ _____ /
  └───────────────────────────────────────────────────────► 可用性
   曲线是指数的:3→4 个 9 只是把不可用时长压 10 倍,
   但靠"人把备用系统拉起来"做不到分钟级恢复——必须自动化,
   而预案自动化本身是最大的复杂度投资(见[复杂度治理](复杂度治理.md))

三个务实结论:

  • 不要默认 4 个 9。按业务影响选:信贷核心资金链路(放款/扣款)值 4 个 9;账单查询 3 个 9;内部运营后台 2 个 9 足够。给所有系统统一拉高 SLO 是花钱买心理安慰。
  • 均值达标 ≠ 稳定。99.99% 摊到全年是 52 分钟。一次 40 分钟的机房级故障就烧掉全年 77% 的预算。SLO 要按滚动窗口管理,不能年底算总账。
  • 可用性买不来正确性。多活架构解决"服务了吗",解决不了"做对了吗"——这是第四节按资损定级的根源。

反例:某系统年报"全年可用性 99.97%",看着健康;拆开看是"前 11 个月 100%,12 月账单日连续故障 2 小时"。全年均值掩盖了故障集中度——信贷的流量与故障都是日历驱动的(大促与月结双峰,见 容量规划与全链路压测),平均值在这个行业尤其会骗人。

二、SLI 选取:从黄金信号推到业务指标 ​

SLI 三条选取标准。用户视角:用户能感知的,不是机器视角的。比例型:好事件 / 总事件,可直接换算成预算。少数派:一个服务不超过 3 个 SLI——全是重点等于没有重点。

分层推导链:

技术 SLI(黄金信号,见[观测性三件套](观测性三件套.md))      业务 SLI(金融真正考核的)
──────────────────────────────────────        ─────────────────────────────────
延迟:放款接口 P99 < 800ms          ──┐
错误:网关 5xx 比例 < 0.1%           ──┼──►    放款成功率 ≥ 99.95%(按笔)
流量:QPS(用于容量规划,不作 SLI)   ──┤       账单日扣款成功率 ≥ 99.9%
饱和度:DB 连接池水位(用于告警)     ──┘       对账差错笔数 = 0(正确性 SLI)

关键认知:技术 SLI 是手段,业务 SLI 是目的。网关 5xx 率 0.05% 全绿,但失败的那部分全是放款单——业务 SLI 直接打红。反过来,业务 SLI 告警了,要靠技术指标 + trace 定位(见 问题定位步骤)。

层SLI 例子回答的问题典型反例
正确性对账差错笔数、利息计算误差笔数做对了吗完全不设——金融系统最大的盲区
业务放款/扣款/额度查询成功率用户拿到服务了吗拿"进程存活"当 SLI(活着但全超时)
技术P99 延迟、5xx 率、依赖超时率问题在哪一层拿 CPU 使用率当 SLI(是原因不是结果)

再补一个穿透反例:把 SLI 定在"入口网关成功率",核心服务超时被网关的静态兜底页遮住。SLI 常绿,用户什么业务都办不成。SLI 必须穿透到业务语义层。静态兜底算不算成功,要按业务语义定义清楚。

三、错误预算:把"多稳定"变成一本账 ​

错误预算 = 1 - SLO
月度 SLO 99.95% → 月预算 = 43800 分钟 × 0.05% ≈ 21.9 分钟

预算消耗 = 故障时长(不可用口径) + 灰度期降级(把用户体验受损也算进来)

错误预算的意义:在"全力求稳"和"快速迭代"之间给出可计算的折中——预算就是创新配额。没有预算机制的团队只剩两个坏选项:要么"任何变更三层审批"(慢死),要么"先上了再说"(事故死)。

预算与发布刹车联动(SLO 落地的关键,不联动就是报表装饰):

预算剩余发布策略
> 30%正常节奏、正常灰度
10% ~ 30%只放低风险变更,灰度档位加密(1% → 2% → 5%),观察时长翻倍
0 ~ 10%冻结功能发布,只允许稳定性修复
< 0(超支)全量冻结 + 强制复盘,超支部分从下月预算扣

消耗速度告警(burn rate):不等预算烧完才反应。"1 小时烧掉月预算 2%"立刻电话告警,"6 小时烧掉 5%"工单告警。发现能力取决于监控告警体系的设计,见 观测性三件套 的报警四问。

两个反例:

  • 预算只算故障不算灰度:大促前一周连续发布,每次引入 0.1% 的静态兜底,单次都不超阈值。用户体验实质降级,预算却显示"充足"。灰度降级必须折算进预算。
  • 预算烧完但大促在即,业务方施压"这个功能必须上"。正确做法不是默默破例,而是走风险评审。要么书面确认临时下调该窗口 SLO 并明确责任,要么把变更挪到预算恢复后。预算制度被撕开口子一次,制度就死了。

四、金融场景:资损优先级定级,而非仅可用性 ​

可用性回答:服务了吗?   ──►  99.99%,全绿
正确性回答:做对了吗?   ──►  失败的 0.01% 里,有 300 笔重复放款
                           每笔都是真金白银 + 客诉 + 监管问询

信贷场景的三条特殊性:

  1. 错误不可逆。少扣一次款可以补扣。多放一笔款、一批账单利息算错,追溯成本远高于故障本身。
  2. 故障反而是"好的"失败方式。系统拒绝/超时,用户重试即可,无损失。系统"降级返回一个猜的额度",就是资损。所以金融降级的默认方向是安全侧(拒绝或走保守策略),不是"给个兜底值"。详见 应急预案三板斧 的降级一节。
  3. 监管与声誉放大。批量错账的影响半径超出技术团队。涉及报送与处罚,公关时间远长于故障时间。

资损优先级定级表(简化版):

级别定义信贷例子响应要求
P1 资损/数据错乱错钱、错账、批量数据错误重复放款、利息多算、额度超卖立即拉全员,止血优先于定位,评估监管报送
P2 核心不可用放款/还款链路整体不可用账单日扣款超时率 90%按 1-5-10 应急响应(见三板斧篇)
P3 局部可用性非核心功能降级/变慢账单导出超时、营销页错误当日修复,值班处理
P4 无感故障冗余层故障,用户无感单实例异常被自动摘除排期修复

定级三要素:影响金额(笔数 × 单笔)、影响客户数、是否可逆。注意 P1 与 P2 可能并存且互相转化。机房故障导致扣款全超时(P2),恢复后消息重放又造成重复扣款(升级为 P1)。定级是动态的,随事态演进而升降。

对账是正确性 SLI 的最后防线:T+1 对账差错笔数必须为 0。这是唯一能兜住"静默资损"(系统不返回错误但做错了)的指标。宁可放款链路 3 个 9 + 对账零差错,不要放款 4 个 9 + 对账形同虚设。

五、SLO 落盘:服务分级与 SLO 目录 ​

SLO 不是每个服务一份大而全的文档,而是一张全公司统一的目录,按服务分级分配预算与保障:

服务等级核心 SLO(月度)预算联动DRI
放款核心S0 资金链路放款成功率 ≥ 99.95%;对账差错 = 0烧完即冻结发布资金域架构师
账单日扣款S0 资金链路扣款成功率 ≥ 99.9%同上账单域架构师
额度/账单查询S1 高流量成功率 ≥ 99.9%联动灰度档位服务 owner
营销/推荐S2 非核心成功率 ≥ 99.5%仅告警,不刹车服务 owner
内部运营后台S3工作时段可用 ≥ 99%不做预算管理服务 owner

分级有三重价值。资源分配:S0 享受双活与 1-5-10 保障,S3 不进应急体系(见 应急预案三板斧)。预期管理:S2 的营销页抖动不该触发 P2 响应。以及预算的价格差——S0 的 1% 预算比 S3 的 1% 预算贵得多,别用同一把尺子考核。

反例:SLO 目录建好后再没人动过——业务早已把某个查询服务变成还款必经链路(事实上的 S0),目录里它还是 S2,预算与保障全错位。SLO 目录要跟着业务重要性走,而业务重要性会变。

六、运营节奏:这本账谁在什么时候看 ​

节奏动作谁参加
日常(值班)burn rate 告警响应,按预案止血值班 oncall
周会过本周预算消耗 Top3 服务,异常消耗归因各域稳定性接口人
月度错误预算复盘:烧在哪、哪些变更贡献了消耗、下月刹车策略架构师 + 质量团队
季度SLO 目录修订:随业务重要性升降级(升 S0 要同步配资源)技术决策会(见 技术决策与ADR)

追问链 ​

老板问:"把可用性从 3 个 9 提到 4 个 9,要花多少钱?"

先反问值不值:当前月度不可用的 43 分钟里,有多少落在核心资金链路?如果故障大头在内部后台,钱应该花在核心链路的预案自动化上,而不是全网统一升 9。SLO 按服务定,不按公司定。

SLO 定 99.9% 还是 99.95%,怎么科学地定?

回看历史 + 业务折算:过去 12 个月真实可用性多少、每次故障折算的业务损失多少。把 SLO 定在"当前水平 + 略需努力"的位置,并约定预算有富余时用于发布提速。定 100% 等于禁发布,定得过低等于没有质量约束。SLO 是双方谈判的结果,不是技术团队单方面的承诺。

为什么金融 SLI 要加"对账差错 = 0"这种绝对指标?

比例型 SLI 衡量可用性,正确性必须用绝对值:0.01% 的错账率乘上亿级交易量就是上千笔资损。可用性指标天然容忍失败,正确性指标必须零容忍——这是金融与普通互联网服务在 SLI 上的分水岭。

错误预算到底是谁的预算?开发的不敢发,业务的不让冻。

预算属于 SLO 承诺的受益方(业务),执行权在稳定性接口人。这正是需要月度复盘对齐的原因。业务方在"发布提速"和"稳定性"之间做权衡并签字,技术方提供消耗数据与风险量化。把预算当技术团队单方面的武器,或当业务方单方面的紧箍咒,都运营不下去。

一句话总结 ​

SLO 把"稳定"翻译成三个可运营的物件:一条业务化的 SLI、一本错误预算账、一套与发布联动的刹车。 而在信贷场景,账本之上还要加盖一层"资损优先"的定级。可用性度量"服务了吗",正确性度量"做对了吗",后者永远排前面。

2026-10 新增(金融级稳定性方法论系列)。