稳定性建设的三个层次:发现影响、控制损失、减少复发

以一次假设的依赖超时故障串起用户指标、应急动作和长期整改,说明中小团队如何分配稳定性投入,并用可验证的复盘行动替代抽象要求。

·5 min
故障组件被隔离,健康请求走替代路径,旁边保留可控的回滚操作。

设想一个订单查询接口:数据库没有宕机,应用进程也都存活,但某个依赖开始超时。线程和连接逐渐排满,自动重试又增加了请求量。值班人员收到一批 CPU、连接数和错误日志告警,却还不知道用户是否能够完成查询。

值班团队需要从这批信号中确认用户影响,执行止损动作,并在复盘中消除复发条件。团队可以同时推进三项工作。新架构无法代替值班流程,监控数量也衡量不了用户是否恢复。

告警要指向用户正在做的事

进程仍在运行、机器负载正常,都无法证明用户可以查到订单。订单团队需要衡量用户能否在约定时间内获得正确结果,HTTP 200 只提供其中一条线索。

先定义有效请求的范围。健康探测、错误凭证、客户端主动取消是否进入分母,应按业务约定处理并单独观察。某些返回 200 的响应只包含降级空数据,对用户来说仍可能失败。这样的失败需要业务指标表达,不能靠 HTTP 状态码猜测。

例如,假设某个统计窗口有一百万次有效请求,可用性目标为 99.9%,则该窗口允许的不良请求预算为:

1,000,000 × (1 - 0.999) = 1,000

这只是请求型 SLO 的算例,不能直接换算为允许停机多少分钟。流量不均匀时,繁忙时段和凌晨同样长的故障消耗不同预算。

告警还应考虑问题是否正在持续。长窗口有助于判断影响规模,短窗口有助于判断当前是否仍在恶化。Google 的 SLO 告警方法讨论了这类组合,也指出低流量服务的比例信号容易失真。不能把示例阈值照搬成所有接口的验收线。

对于低频但重要的操作,错误次数、合成探测和用户反馈可能比单纯错误率更有用。探测要经过关键路径,又不能在生产制造真实支付等副作用。

值班手册要写清动作前提

故障发生后,值班人员要从手册中找到动作、适用条件和风险。“检查日志”无法指导下一步操作。

以依赖超时为例,可以准备这样一份动作表:

观察到的情况 可考虑的动作 执行前必须确认
可选推荐依赖变慢 暂停推荐调用,保留主流程 空推荐是否被客户端正确处理
最近发布后错误集中出现 回退应用版本 旧版本能否读取当前数据格式
单租户消耗大量资源 限制该租户的新请求 身份识别可靠,其他租户不会被误伤
查询负载拖累核心写入 暂停昂贵报表或缩短查询预算 核心用户旅程及拒绝响应有明确约定

动作应有负责人、观察窗口和退出条件。限制流量后如果错误减少,但核心业务完成量也跌到不可接受水平,不能仅凭错误率宣布恢复。应同时看成功完成量和被拒绝的工作量。

重试尤其容易制造次生故障。若一条调用链的三个层级都允许一次请求最多尝试三次,在全部失败且每层都重放的假设下,最底层可能收到最多 27 次尝试。这是最坏情形的算术示例,不是任何系统的测量结果。

掌握调用语义的单一层级负责重试,并限制总时间和次数,配合退避与抖动。写操作还需提供幂等保证。调用方遇到超时,只能确认自己没有按时取得结果,业务操作仍可能已经提交。

Amazon Builders' Library 的 超时、重试与抖动退避从调用方视角讨论了同一风险:重试会增加依赖负载,多层重试还会放大请求。团队需要把连接超时、请求超时和总重试预算分开设置,并通过调用链中的单一责任层控制重放。

降级同样不能越过正确性边界。商品推荐缺失可能可以接受,权限判断失败却不能退化为允许访问;库存来源不可用时,也不能伪造“库存充足”。每个降级分支都应由业务负责人确认。

复盘任务必须对应失效条件

服务恢复之后,复盘需要重建时间线:用户什么时候开始失败,告警什么时候触发,值班人员依据什么信息采取动作,哪个动作改变了局面。原始记录不全时,应标出未知区间,不能用回忆补成精确时间。

负责人无法验收“加强监控”“提高意识”“完善测试”。复盘任务应绑定具体失效条件。例如:

观察:
推荐依赖超时后,请求继续占用主流程并发名额。

整改:
为推荐路径设置独立并发上限和超时预算;
超限或超时时返回已约定的空推荐结构。

验收:
在受控环境模拟推荐依赖持续超时,
确认主流程满足约定 SLO,拒绝量和降级量可见,
恢复依赖后无需重启即可退出降级。

约束:
不得改变下单鉴权和库存校验行为。

这是一份演练定义,不是已经完成的演练记录。实现者、截止时间和证据位置需要在真实任务中补充。

长期整改也可以删除复杂度。团队若发现关键接口同步等待一项无需实时完成的工作,可以把它移出请求路径,减少原链路上的重试策略。改成异步后,团队还要处理可见延迟、补偿和积压。

不要承诺“架构免疫”。隔离故障域可以降低传播,副本可以应对部分节点故障,却不能自动防止错误配置、权限缺陷或同一软件版本的系统性问题。

小团队先守住一条关键旅程

资源有限的团队可以先选一条关键用户旅程,把检测、值班和止损串起来。值班人员需要知道谁接收告警、谁有操作权限,以及用哪些数据确认恢复。

如果大量告警都在重复提示同一类问题,优先修复这条故障路径。若事故处理时间主要花在寻找负责人和确认版本上,先补责任与发布记录。若回退因数据不兼容频繁失败,再安排迁移协议和兼容窗口。

衡量进展时,除故障数量外,还应看影响范围、恢复过程中的误操作、演练暴露的问题是否关闭。同一团队的事故样本往往很少,单个恢复时间下降不能证明体系成熟。保留每次判断所依据的记录,下次值班人员才能知道哪些动作已经验证,哪些仍然只是设想。