跳到主要内容

限流熔断与降级

流量突增或下游故障时,系统不能无限排队直到拖垮自己。限流、熔断、降级是保护边界的三种手段,常和 Redis、缓存与消息队列 一起出现。

三者分工​

手段回答的问题类比
限流入口流量是否超限?景区限流
熔断下游已经坏了,还要一直打吗?电闸跳闸
降级保核心、舍非核心?战时配给
请求 → 限流 → 业务 → 调下游
↓ 失败率/延迟高
熔断打开 → 快速失败或走降级逻辑

限流​

算法说明
固定窗口每分钟 N 次;边界可能突发 2N
滑动窗口平滑窗口计数
令牌桶匀速放令牌,可应对一定突发
漏桶恒定流出速率
粒度例子
全局限流保护整个服务
用户/IP防刷
接口热点 API 单独配额

实现:网关(Nginx/Kong)、应用内(Guava/Sentinel)、Redis 计数。

HTTP 429 Too Many Requests + Retry-After。

熔断(Circuit Breaker)​

状态机:Closed → Open → Half-Open

状态行为
Closed正常调用
Open失败率/慢调用超阈值,直接失败,不调下游
Half-Open试探少量请求,成功则 Closed
参数说明
失败率阈值如 50% / 10s
最小请求数样本太少不熔断
打开时长冷却后再 Half-Open

与 超时、重试 配合:重试次数过多会放大故障(retry storm)。

降级​

类型例子
读降级返回缓存默认值、静态兜底页
写降级异步化、队列削峰
功能降级关评论、关推荐,保下单支付
体验降级简化 UI、提示稍后再试

降级要 可配置、可观测、可回滚;别静默丢数据。

和缓存 / MQ 的关系​

组合场景
限流 + 队列入口拒绝 + 异步排队(注意积压)
缓存降级下游挂时读 stale cache
熔断 + 降级快速失败 + 兜底响应

可观测​

指标说明
QPS / 拒绝数限流是否过严
熔断状态Open 时长、恢复次数
降级命中率兜底是否过多

常见误解​

  1. 「限流越多越好」——误杀正常用户;要分级与白名单
  2. 「熔断 = 重启服务」——是调用侧停止打坏下游
  3. 「降级就是返回 null」——要有业务可接受的兜底

面试速记​

  1. 限流算法? 固定/滑动窗口、令牌桶、漏桶。
  2. 熔断三状态? Closed / Open / Half-Open。
  3. 降级和熔断区别? 熔断保护调用链;降级是功能/体验取舍。
  4. 为什么限流在网关做? 统一入口、早拒绝、省资源。网关动态路由与分布式限流见 API 网关设计与实现。
  5. 重试和熔断冲突? 盲目重试放大故障;要限次 + 幂等。