908 字
约 3 分钟
9
S17-A01 · 服务治理:限流、熔断、降级

适用读者:见过"一个下游挂了拖垮全站"的人。
前置:S17-J02。
覆盖旧文:412(105) 918(86) 1560(426) = 617 点。
覆盖扩展:E-S17-011(雪崩的三级防线)。
上一篇:S17-J05 · 分布式 ID:雪花、号段与时钟回拨
下一篇:S17-A02 · 链路追踪与可观测性。


1. 一句话结论

雪崩不是"某个服务慢",是"线程被慢调用占满 → 排队 → 超时 → 重试放大 → 全线崩溃"。三级防线:限流(挡外面)、熔断(断坏的下游)、降级(给兜底答案)。

请求 → ① 限流(超阈值直接拒)
     → ② 熔断(下游错误率高 → 快速失败,不调用)
     → ③ 降级(返回默认值/缓存)

2. 三个手段的边界(E-S17-011)

手段 作用对象 触发条件 效果
限流 入口流量 QPS/并发超阈值 拒掉多余请求
熔断 下游依赖 错误率/慢调用比例 不再调用(快速失败)
降级 业务功能 熔断/超载 返回兜底

"限流 vs 熔断":

限流 熔断
看谁 自己承受能力 下游健康度
目的 保护自己 保护调用链
恢复 手动/自动 半开探测(自动)

3. 熔断的三态与半开

状态 行为
Closed(闭合) 正常放行
Open(打开) 直接失败(不调用下游)
Half-Open(半开) 放少量请求试探 → 成功则闭合

"半开为什么必须有":没有它,下游恢复了也永远熔断(无法自愈)。


4. 限流的四种算法

算法 特点
固定窗口 简单,边界双倍放行
滑动窗口 更平滑
令牌桶 允许突发(推荐)
漏桶 恒定速率

与 S12-J05 的呼应:Redis INCR + EXPIRE 是固定窗口的简易实现;生产用令牌桶。


5. 降级的三条纪律

纪律 说明
可开关 降级要能一键开关(配置中心,S17-B05)
兜底要有意义 返回缓存/默认值,别返回错误
不能掩盖故障 降级要打点+告警,否则故障被藏起来

判据:"降级后业务还能完成核心目标吗?" 不能 → 降级设计错了。


6. 五个误区

误区 真相
"限流能防雪崩" 只挡入口,不解决下游慢
"熔断打开就够了" 没有半开就无法恢复
"重试能提高成功率" 故障时放大流量
"降级不用告警" 故障被掩盖
"超时设长点更稳" 长超时会占满线程

7. 自检(架构师版)

  1. 三级防线各自作用对象?
  2. 限流与熔断的区别?
  3. 熔断三态与半开的作用?
  4. 令牌桶与固定窗口的差别?
  5. 降级的三条纪律?

8. 下一篇

S17-A02 · 链路追踪与可观测性

治理讲完,下一篇讲"出问题时怎么定位到具体那一段"。


本篇属于系列《S17 · 分布式与消息队列》。旧文来源:A-412/918/1560;扩展点 E-S17-011。

S17-A01 · 服务治理:限流、熔断、降级
https://www.clxhxhhr.top/posts/5430/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。