熔断、降级、限流分别解决什么问题?在整体架构中如何联动?
结论先行:三者都是保护机制,但对象不同:限流保护自己不被超过承载的流量压垮;熔断保护下游不被持续的错误请求打垮,也让调用方快速失败;降级是牺牲非核心功能保住核心链路。真实系统按“入口限流 → 依赖熔断 → 非核心降级”分层联动。
一、三者定位对比
| 手段 | 保护对象 | 触发依据 | 典型动作 |
|---|
| 限流 | 自身实例/集群 | QPS、并发数、配额 | 拒绝 429、排队 |
| 熔断 | 下游依赖 | 错误率/慢调用超阈值 | 快速失败、开闸试探 |
| 降级 | 核心链路 | 依赖异常、资源紧张 | 返回兜底、关闭非核心功能 |
二、熔断状态机(以 Sentinel/Hystrix 为例)
Closed(正常)--错误率超阈值--> Open(熔断,直接快速失败)
Open --休眠窗口结束--> Half-Open(放少量试探流量)
Half-Open 成功 → Closed;Half-Open 失败 → 回到 Open
- 关键参数:错误率阈值、最小调用量(防小流量误触发)、熔断窗口、试探流量大小。
三、限流算法对比
| 算法 | 思路 | 特点 |
|---|
| 固定窗口 | 每秒计数归零 | 简单,临界点可突发击穿 |
| 滑动窗口 | 细粒度分桶统计 | 平滑,实现稍重 |
| 漏桶 | 恒定速率流出 | 强制匀速,抗突发差 |
| 令牌桶 | 按速率补令牌、可攒 | 允许突发,最常用 |
网关层:按 IP/用户粗限流(Redis 分布式计数)
服务层:按接口/资源配额细限流(Sentinel 等)
四、降级的常见姿势
- 超时降级:依赖超时就返回缓存值/默认值,不让用户无限等待。
- 异常降级:捕获异常后给兜底结果并记录,异步补偿。
- 功能降级:大促时关闭评论、推荐等非核心功能,把资源让给交易链路。
常见追问与记忆点
- 追问:熔断与重试同时出现时谁先谁后?熔断开启时禁止重试,否则试探流量被放大;先熔断,恢复探测按退避节奏来。
- 追问:降级与限流一句话区别?限流挡“进不来的人”,降级砍“没那么重要的功能”。
- 记忆点:限流护自己、熔断护下游、降级护核心;三者联动才能扛住故障与峰值。