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. 自检(架构师版)
- 三级防线各自作用对象?
- 限流与熔断的区别?
- 熔断三态与半开的作用?
- 令牌桶与固定窗口的差别?
- 降级的三条纪律?
8. 下一篇
S17-A02 · 链路追踪与可观测性
治理讲完,下一篇讲"出问题时怎么定位到具体那一段"。
本篇属于系列《S17 · 分布式与消息队列》。旧文来源:A-412/918/1560;扩展点 E-S17-011。
S17-A01 · 服务治理:限流、熔断、降级
https://www.clxhxhhr.top/posts/5430/ 评论
0 条
还没有评论,先写一条吧。