熔断器

当下游错误率或慢调用比例超过阈值时快速失败一段时间,给下游恢复窗口;半开状态放少量探测流量验证恢复,是防止级联故障的常用手段。

熔断器是什么

熔断器像电路里的保险丝:当下游错误率或慢调用比例超过阈值时,调用方在接下来一段时间内直接快速失败,不再把请求发往已经出问题的下游,从而避免线程、连接被长时间占满导致的级联故障。经过冷却期后进入半开状态,放少量探测流量验证下游是否恢复,正常则闭合恢复调用,仍失败则重新打开。熔断的价值在于给下游留出恢复窗口,同时让调用方更快失败。

三种状态

三种状态
CLOSED    → 正常放行,按窗口统计错误率与慢调用比例
OPEN      → 直接失败,不再请求下游,同时走兜底逻辑
HALF-OPEN → 放行少量探测请求;达标回 CLOSED,仍失败回 OPEN

# 触发开关:错误率或慢调用比例超过阈值且请求数达到最小样本量
# 冷却时间:可分批递增,避免下游刚恢复就被打满

参数与兜底设计

项参考做法标定依据
触发阈值窗口内错误率或慢调用比例(如 50%)且达到最小请求数(如 20 次)按压测与历史抖动幅度标定,正常波动不触发
慢调用定义超过 P99 或约定的超时预算比例按端到端延迟预算倒推
打开时长从数秒起步,可分批递增给下游恢复窗口,过长会放大影响面
半开探测只放行少量请求,全部达标才闭合防止瞬间恢复全量流量
兜底缓存旧值、默认值或转异步,并配告警没有兜底的快速失败对用户仍是不可用

典型使用场景

  • 第三方接口不稳定:外部依赖超时拖慢整条链路,用熔断隔离
  • 大促前压测:验证下游故障时核心链路仍能返回兜底结果
  • 级联故障防护:避免一个下游拖垮所有调用它的服务
  • 灰度发布保护:新版本错误率异常时快速切断流量
  • 弱依赖降级:推荐、风控等非核心能力失败时快速返回默认值
  • 批量任务保护:单个分片下游异常时暂停并告警,而不是持续重试
熔断必须配兜底结果:缓存旧值、默认值或转异步处理,否则「快速失败」对用户而言仍是一次失败,只是快了一点。
熔断与重试要一起设计:重试会在下游抖动时放大流量,通常应限制重试次数并把重试计入错误率统计,避免熔断被重试掩盖。

易错点

  • 阈值未经标定:正常抖动即触发熔断,非故障期也在拒绝请求
  • 只有熔断没有兜底与告警:故障静默放大,用户侧只看到报错
  • 重试次数过多:下游抖动被放大成雪崩,熔断也来不及生效
  • 熔断影响面过大:按服务粒度熔断导致一个接口异常波及全部功能
  • 半开探测放量过猛:下游刚恢复就被全量流量打回故障状态

数据来源与参考

  • 《Release It!(第 2 版)》(Nygard)第 4 章
  • microservices.io:Circuit Breaker
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌