3. 熔断基础:熔断器状态机(Closed/Open/Half-Open)、熔断触发条件与恢复策略

熔断器(Circuit Breaker)是分布式系统中防止级联故障的核心治理模式。其设计灵感来源于电路中的物理断路器:当电流过载时自动断开,保护整个电路不被烧毁。在微服务架构中,熔断器通过监控调用失败率,在系统不稳定时主动切断请求链路,为下游服务提供喘息恢复的时间窗口。

3.1 熔断器三态状态机

标准的熔断器状态机包含三个核心状态:Closed(关闭)、Open(打开) 和 Half-Open(半开)。这三个状态构成一个有限状态自动机,驱动熔断器在不同负载条件下自动切换。

核心原则:熔断器不是故障预防工具,而是故障隔离与恢复工具。它假设故障必然发生,重点在于如何限制故障影响范围并安全恢复。
熔断器三态状态机流转图 Closed 关闭状态 正常调用 Open 打开状态 快速失败 Half-Open 半开状态 试探恢复 失败率超阈值 超时窗口到期 试探成功 试探失败 状态转换说明: • Closed → Open:连续失败次数或失败率超过阈值,熔断器打开,拒绝所有请求。 • Open → Half-Open:经过设定的超时时间后,允许少量试探请求通过。 • Half-Open → Closed/Open:试探请求成功则关闭熔断器;失败则重新打开。

3.2 熔断触发条件

熔断器从 Closed 切换到 Open 并非由单一指标决定,而是基于一组可配置的触发条件。以下是业界通用的触发条件体系:

触发条件 说明 典型阈值 适用场景
连续失败次数 最近 N 次调用全部失败,触发熔断 5 ~ 10 次 快速检测瞬时故障
失败率阈值 滑动窗口内失败请求占比超过设定值 50% ~ 80% 慢速累积故障检测
超时比例 响应时间超过阈值的请求占比过高 P99 > 2000ms 占比 > 30% 服务响应退化检测
最小请求数 触发熔断前必须达到的最低请求量 10 ~ 20 次 避免冷启动误判
异常类型过滤 仅对特定异常(如超时、5xx)计数 TimeoutException, ServerError 区分业务异常与系统异常
设计要点:最小请求数(Minimum Request Threshold)是防止熔断器误触发的关键参数。在低流量时段,少量失败不应触发熔断。建议将最小请求数设置为滑动窗口内至少 10~20 次请求。

3.3 恢复策略

熔断器进入 Open 状态后,系统需要一套可靠的恢复机制来验证下游服务是否已恢复正常。恢复策略的核心在于 试探窗口 和 渐进恢复 两个维度。

3.3.1 超时窗口策略

熔断器在 Open 状态停留的时间称为超时窗口(Timeout Window)。窗口到期后,熔断器自动进入 Half-Open 状态。窗口长度的设定直接影响系统恢复速度:

  • 固定窗口:每次熔断后等待固定时长(如 30 秒),实现简单但缺乏弹性。
  • 指数退避窗口:首次熔断等待 10 秒,第二次 20 秒,第三次 40 秒……防止频繁试探加重下游负担。
  • 自适应窗口:根据下游服务的恢复速度动态调整窗口长度,需要额外的健康探测机制。

3.3.2 试探恢复流程

Half-Open 状态下的试探恢复是熔断器最精妙的设计。它通过限制试探请求的数量和频率,在安全性和恢复速度之间取得平衡。

Half-Open 试探恢复详细流程 进入 Half-Open 允许 N 个试探请求 判断试探结果 成功 → Closed 失败 → Open 全部成功 任一失败

3.3.3 试探请求数量策略

Half-Open 状态下允许通过的试探请求数量(N 值)是恢复策略的关键参数:

  • 固定数量:每次允许 1~3 个请求通过,简单但恢复速度慢。
  • 比例策略:允许正常流量的 5%~10% 通过,逐步增加试探压力。
  • 渐进式:首次试探 1 个请求,成功后增加至 3 个,再成功增加至 5 个,直到完全关闭熔断器。
常见陷阱:试探请求数量过多会导致下游服务在未完全恢复时再次被压垮,形成反复熔断的震荡现象。建议从 1 个试探请求开始,逐步递增。

3.4 状态机参数配置清单

以下是生产环境中熔断器状态机的典型参数配置,供架构设计时参考:

参数名称 默认值 推荐范围 说明
failureThreshold 5 3 ~ 10 连续失败次数阈值
failureRateThreshold 50% 40% ~ 80% 滑动窗口内失败率阈值
slidingWindowSize 100 50 ~ 200 滑动窗口请求计数大小
minRequestThreshold 10 5 ~ 20 触发熔断的最小请求数
timeoutWindow 30s 10s ~ 120s Open 状态超时窗口
halfOpenMaxRequests 3 1 ~ 5 Half-Open 试探请求数

3.5 缓存一致性视角下的熔断器设计

在缓存一致性闭环的上下文中,熔断器不仅保护下游服务,还需要与缓存策略协同工作:

  • 熔断期间缓存降级:当熔断器进入 Open 状态时,所有请求直接返回缓存中的过期数据(Stale Cache),避免请求穿透到故障服务。
  • Half-Open 试探与缓存更新:试探请求成功后,立即触发缓存更新操作,将最新数据写入缓存,为后续正常请求预热。
  • 熔断恢复后的缓存同步:从 Half-Open 切换到 Closed 时,需要同步清除熔断期间积累的降级标记,恢复正常的缓存读写策略。
缓存一致性闭环要点:熔断器状态变化应作为缓存策略切换的触发器。Closed 状态使用正常缓存策略(先读缓存,异步写缓存);Open 状态使用降级缓存策略(只读缓存,不写缓存);Half-Open 状态使用试探缓存策略(读缓存 + 试探写缓存)。