为什么需要限流熔断降级
大促、热点事件、爬虫都会让流量瞬间放大几十倍。后端服务的线程池、连接池、数据库连接都是有上限的,流量超过承载能力时,请求排队、响应变慢、超时连锁,最后整体雪崩。限流是主动拒绝超出阈值的请求,熔断是当下游持续失败时暂时切断调用,降级是用兜底响应替代非核心功能。三者合起来,是高可用的三道防线。
本文核心知识点
- 限流控制单位时间内通过的请求数。
- 熔断下游异常时自动断开,给它恢复时间。
- 降级牺牲边缘功能保核心链路。
- Sentinel阿里开源的流量与熔断组件。
令牌桶与漏桶:两种限流算法
令牌桶以固定速率往桶里放令牌,每个请求要拿到一个令牌才放行;桶有容量,允许一定程度的突发流量。漏桶则是请求先进桶,桶以固定速率流出处理,无论进来多猛,出去都是匀速。令牌桶能扛突发、漏桶更平滑,前者适合大多数接口,后者适合保护下游固定吞吐的场景。
计数器与滑动窗口
最简单的是固定窗口计数器:每分钟数请求数,超了就拒。问题是窗口交界处的突发会瞬间冲到两倍。滑动窗口把窗口切成更细的格子、滚动统计,能平滑掉边界突刺,是生产上更常用的实现。
熔断:当下游拖垮自己时
下游服务变慢或报错时,如果还一直调用,自己的线程会被挂起占满。熔断器统计失败率,超过阈值就打开:一段时间内直接走兜底、不再真正调用下游;过了窗口期进入半开,放少量请求试探,恢复了就关闭熔断。这避免了雪崩级联。
// 伪代码:失败率超阈则熔断
if (failRate > 0.5) {
circuit.open(); // 打开,直接返回兜底
} else if (circuit.isHalfOpen()) {
return tryCall(); // 半开试探
}
降级:保核心、舍边缘
降级是主动"关掉"非核心功能:推荐位关闭、评价数不实时算、返回缓存的旧数据。核心下单、支付链路永远优先保证。降级可以按开关手动触发,也可以在熔断触发时自动兜底。
Sentinel 落地示例
Sentinel 把限流、熔断、降级做成可视化规则:在控制台给某个接口设 QPS 阈值、失败比例、慢调用比例,代码里用注解标记资源即可,规则可实时推送、无需重启。比自己手写计数器维护成本低得多。
限流放在哪一层
限流可以在网关层(挡掉绝大部分恶意流量)、应用层(保护单个接口)、客户端层(按钮置灰防重复点击)分层布。别只靠一层:网关挡住了,单个热点接口仍可能被打垮。
落地清单
- 核心接口配限流,允许适度突发用令牌桶。
- 下游调用加熔断,失败率超阈自动断开。
- 提前准备降级兜底数据,别让用户看到报错。
- 网关、应用、客户端分层限流。
- 用 Sentinel 等组件托管规则,别手写散落各处。