Skip to content

应急预案三板斧:限流、降级、切流 ​

定位:金融级稳定性方法论(3/6)。故障发生后的前 10 分钟,架构师能动的只有三个动作。限流(少接一点)、降级(少做一点)、切流(换一拨机器做)。本篇写三板斧各自的适用瞬间、预案的自动化与预案库、演练驱动,以及"1-5-10"应急响应目标。前置阅读:SLO 与稳定性工程(为什么恢复优先于定位)。容量阈值从哪来见 容量规划与全链路压测。切流操作的细节见 系统切流通用方案。

一、三板斧总览:三个动作对应三种故障形态 ​

动作解决的故障形态生效时间代价决策难度
限流过载(流量 > 容量)秒级拒绝部分请求低:阈值可预置
降级依赖故障(下游挂了)秒级功能损失中:降谁、降到什么方向
切流机房级故障分钟级损失一半容量,切回要谨慎高:不可轻易撤销
        用户流量
           │
           ▼
     ┌───────────┐   过载 ──► 限流:入口/热点/DB 前,拒绝超额部分
     │  网关/LB   │────────────────────────────────────┐
     └───────────┘                                     ▼
           │                                    (超额请求被拒绝)
           ▼
     ┌───────────┐   依赖故障 ──► 降级:非核心链路熔断让路,
     │  核心服务   │──────► 依赖(风控/征信/营销/消息)
     └───────────┘           核心依赖走安全侧策略
           │
           ▼
     ┌───────────┐   机房级故障 ──► 切流:单元化路由摘掉故障单元,
     │  机房 A/B  │                流量整体迁移(见系统切流通用方案)
     └───────────┘

判断顺序自上而下。先问"是不是流量问题"(限流),再问"是不是依赖问题"(降级),最后问"是不是场地问题"(切流)。三板斧可以叠加使用——切流后剩余容量减半,通常要配合限流。

二、限流:过载的瞬间 ​

  • 三层布防:入口限流(网关全局 QPS,保住大盘)。热点参数限流(单账户/单商户维度,防刷子与重试风暴打穿分片)。资源前限流(DB/渠道连接前设闸,保护最先死的那个资源)。
  • 阈值从压测来,不是拍的。容量验证到拐点在 8 万 QPS、日常水位目标 50%,则入口限流按双活容量折算。数字链条见 容量规划与全链路压测。
  • 金融的限流要按业务优先级分级,不是先到先得:放款/还款交易 > 账单查询 > 营销活动。账单日容量吃紧时先停营销查询,绝不能让"查询把扣款挤出去"。

限流算法选型速查:

算法特点适用
固定窗口计数最简单,窗口边界有 2 倍突刺风险粗粒度兜底
滑动窗口平滑边界问题,内存略高入口全局限流
令牌桶允许突发(桶里攒令牌),平均速率可控大多数场景默认
漏桶绝对平滑,削峰填谷保护脆弱下游(如渠道调用)
集群限流(中心配额)全局精确,依赖中心组件可用性S0 资金链路,必配本地兜底

集群限流的陷阱:中心配额服务自己挂了怎么办——必须能降级到"本机令牌桶按节点数均摊"。否则限流组件成了新的单点。它的故障形态本身就该在混沌演练的注入清单里,见 混沌工程与故障演练。

  • 反例一:只在入口限流,DB 慢查询把连接池拖死——入口 QPS 还没到阈值,库先死了。保护点要放在最先死的资源前面,而不是流量进来的地方。
  • 反例二:限流返回"系统繁忙"但客户端疯狂重试,实际流量放大 3 倍——限流响应必须携带"退避指令"(重试间隔/不重试标记),否则限流本身制造重试风暴。

三、降级:依赖故障的瞬间 ​

降级的核心是预先回答一个问题:这个依赖挂了,核心业务能不能继续,以什么姿态继续。

  • 非核心链路:直接关。营销推荐、积分计算、消息通知——开关一键关闭,主链路吞吐立刻回升。这些开关要在方案设计期就埋好(见 如何出一个技术方案 的"异常与降级"一节)。
  • 核心链路:读写分开定方向。
    • 读场景可以兜底:额度查询超时,返回带标注的缓存旧值,可用性换弱一致。
    • 写场景必须安全侧:风控决策超时,动作是拒绝放款而不是"放行兜底"或"给默认额度"。金融的降级方向是"宁可少做,不可做错"(对照 SLO 与稳定性工程 的资损定级)。
  • 反例(真实教训型):降级逻辑写成"风控超时返回默认通过",上线半年无人触发,某次风控集群故障两小时内放出去的每一笔都是没有决策过的——降级预案里最危险的一句话就是"给个默认值继续跑"。
  • 工程要求:降级开关默认值 = 安全值。支持按比例降级(10% → 50% → 100%,观察生效)。降级本身要有监控(降级命中率、降级期间的交易通过率)。

降级清单(设计期就要填好的表,随方案评审一起过):

依赖类型降级动作方向开关名
营销推荐非核心直接关闭,返回默认位可用性deg_marketing_off
风控决策核心写超时拒绝放款安全侧deg_risk_reject
额度查询缓存核心读返回带标注旧值弱一致deg_quota_stale
短信通知旁路停发 + 入库延后补发延迟deg_sms_hold

四、切流:机房级的瞬间 ​

  • 触发条件:整个机房的电力/网络/核心交换故障,或区域性灾难——前两板斧对"场地没了"无效。
  • 决策与预授权:切流是重动作,等汇报链走完损失已经扩大。正确机制是预授权。满足预设条件时,值班架构师有权直接执行,事后复盘。预设条件如:核心 SLI 在故障机房归零且持续 N 分钟、探测确认非应用层问题。授权条件写进预案库,而不是靠临场勇气。
  • 单元化下的切流本质是路由表操作:摘掉故障单元,流量按权重摊到健康单元,分钟级完成。难点在数据层(切流前的增量复制、切流后的双向对账)。见 系统切流通用方案 的白名单到百分比节奏。
  • 反例:切流演练只切了"入口流量",没切定时任务。切流后两个机房同时跑扣款 Job,重复扣款直接把 P2 故障升级成 P1 资损。切流清单必须覆盖:流量、Job、MQ 消费组、回调地址。

五、预案的自动化与预案库 ​

一条预案的标准结构:

预案 = 触发条件(指标 + 阈值 + 持续时间)
     + 动作(限流到 X% / 关闭 Y 开关 / 摘除 Z 单元)
     + 影响面评估(受影响的业务、比例、预估客诉)
     + 回退方法(恢复条件 + 回退动作 + 验证)
     + 责任人与预授权级别(自动 / 值班一键 / 需审批)
  • 分级自动化:熔断类不需要人(自动预案)。限流降级做成"一键执行 + 平台审批留痕"(半自动)。跨机房切流保留人工确认但预授权(手动预案要有 runbook)。
  • 预案库按"故障场景 × 系统"索引。每次故障复盘的产出之一就是"新预案入库"或"旧预案修正"。预案库的更新频率是稳定性投入是否落地的真实指标。
  • 执行结果要验证生效。点了限流按钮,平台要回读"当前入口 QPS 是否真的降下来了",而不是只记录"按钮已按下"。反例:预案库里躺着 200 条预案,真故障时发现开关早已失配。服务改了名、脚本里写死的机器 IP 扩容后失效。预案不演练 = 没有预案,演练机制见 混沌工程与故障演练。

预案库片段示例(按"场景 × 系统"索引,平台可一键执行):

编号场景动作触发自动化级别
YJ-001入口 QPS 超容量 120%网关限流降到安全水位自动(压测阈值联动)自动
YJ-014风控决策超时率 > 50%放款走安全侧拒绝 + 营销全停一键半自动
YJ-032账单 DB 主库不可用主从切换 + 扣款 Job 暂停重入一键(值班预授权)半自动
YJ-051机房级失联单元化切流摘机房双人确认 + 预授权手动(runbook)

六、1-5-10:应急响应的时间目标 ​

阶段目标支撑手段对应文档
1 分钟发现告警必须先于客诉业务 SLI 告警 + burn rate 告警,告警带维度与责任路由观测性三件套
5 分钟定位说出故障在三板斧哪一层分层 dashboard、变更时间线对齐、trace 快速归因问题定位步骤
10 分钟恢复预案执行完成且生效校验通过预案自动化 + 预授权 + 演练肌肉记忆本篇 + 混沌工程篇

MTTR 分解(按月看趋势,别混成一个大数):

MTTD ───► MTTA ───► MTTI ───► MTTF
发现      响应      定位      止血
≤1min     ≤2min     ≤5min     ≤10min(从事发点计)
   │         │        │         │
 告警体系  oncall   dashboard  预案自动化
 覆盖度   纪律      +变更时间线 + 预授权

两个关键认知:

  • 恢复不等定位。10 分钟的目标不是"找到根因"而是"止血完成"——先三板斧,再查根因。见 问题定位步骤 的"先止血再找根因"。用 MTTR 分解度量:MTTD(发现)+ MTTA(响应)+ MTTI(定位)+ MTTF(止血),每段单独看趋势,别混在一个大数里自我安慰。
  • 1-5-10 是设计目标不是考核口号。做不到 1 分钟发现,先补监控覆盖。做不到 5 分钟定位,先补 dashboard 分层与变更可视化。做不到 10 分钟恢复,先补预案自动化——每个数字背后对应一项稳定性基建投资。

七、通报与升级:别让信息比故障慢 ​

三板斧解决"恢复",通报解决"协同"——客服、业务方、合作银行都在等同一个答案:

故障确认 5 分钟内 ──► 一号通报:有故障、影响面初判、正在止血
每 15 分钟更新   ──► 进展通报:三板斧执行到哪一步、恢复预期
恢复后 24 小时   ──► 初步复盘:时间线 + 直接原因
恢复后 5 个工作日 ──► 完整复盘:根因 + 预算消耗 + 预案改进项入库

升级机制(escalation):15 分钟未止血自动升级域架构师,30 分钟升级稳定性委员会。升级不是追责,是把更大的决策权(如切流的预授权)更快地搬到现场。

反例:故障群里 40 条消息全是"有进展了吗",没有一条"当前结论"。通报要有固定模板(现象/影响/已执行动作/下次更新时间),让阅读者 10 秒拿到结论;一号通报宁要"初步判断"不要"还在查"——信息的价值随时间衰减,比故障恢复慢的通报等于没有通报。

一句话总结 ​

限流保自己不死,降级保核心不断,切流保场地没了还能活。预案 = 触发条件 + 动作 + 影响面 + 回退 + 预授权,放在库里、接在平台上、每年演练。1-5-10 里最贵的是第一个 1——发现不了,后面全是空谈。

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