为什么需要限流熔断降级

大促、热点事件、爬虫都会让流量瞬间放大几十倍。后端服务的线程池、连接池、数据库连接都是有上限的,流量超过承载能力时,请求排队、响应变慢、超时连锁,最后整体雪崩。限流是主动拒绝超出阈值的请求,熔断是当下游持续失败时暂时切断调用,降级是用兜底响应替代非核心功能。三者合起来,是高可用的三道防线。

本文核心知识点
  • 限流控制单位时间内通过的请求数。
  • 熔断下游异常时自动断开,给它恢复时间。
  • 降级牺牲边缘功能保核心链路。
  • Sentinel阿里开源的流量与熔断组件。
限流熔断降级配图:蓝色渐变背景左侧汹涌流量方块队列经中央发光闸门限流成右侧平稳细流,扁平科技插画
汹涌流量被闸门切成平稳细流,正是限流把突发峰值削平的意象。

令牌桶与漏桶:两种限流算法

令牌桶以固定速率往桶里放令牌,每个请求要拿到一个令牌才放行;桶有容量,允许一定程度的突发流量。漏桶则是请求先进桶,桶以固定速率流出处理,无论进来多猛,出去都是匀速。令牌桶能扛突发、漏桶更平滑,前者适合大多数接口,后者适合保护下游固定吞吐的场景。

计数器与滑动窗口

最简单的是固定窗口计数器:每分钟数请求数,超了就拒。问题是窗口交界处的突发会瞬间冲到两倍。滑动窗口把窗口切成更细的格子、滚动统计,能平滑掉边界突刺,是生产上更常用的实现。

熔断:当下游拖垮自己时

下游服务变慢或报错时,如果还一直调用,自己的线程会被挂起占满。熔断器统计失败率,超过阈值就打开:一段时间内直接走兜底、不再真正调用下游;过了窗口期进入半开,放少量请求试探,恢复了就关闭熔断。这避免了雪崩级联。

// 伪代码:失败率超阈则熔断
if (failRate > 0.5) {
  circuit.open();          // 打开,直接返回兜底
} else if (circuit.isHalfOpen()) {
  return tryCall();        // 半开试探
}