4. 熔断状态机详解:Closed、Open、Half-Open 及状态转换条件

熔断器(Circuit Breaker)的核心是一个三态状态机。理解这三个状态及其转换条件,是设计稳定API熔断策略的基础。每个状态都对应着不同的流量处理策略和系统保护目标。

4.1 三态状态机总览

熔断器在 Closed(关闭)、Open(开启) 和 Half-Open(半开) 三个状态之间循环转换,形成一个完整的自我保护闭环。

熔断器三态状态机转换图 Closed (关闭状态) Open (开启状态) Half-Open (半开状态) 失败阈值 达到 超时等待 结束 探测请求成功 → 恢复 探测请求失败 → 再次熔断 状态转换核心逻辑: • Closed → Open:连续失败次数或错误率超过阈值,立即熔断 • Open → Half-Open:经过预设的休眠时间(sleepWindow),允许试探性恢复 • Half-Open → Closed/Open:根据探测请求的成功/失败结果,决定恢复或再次熔断

4.2 Closed(关闭状态)—— 正常运行态

Closed 是熔断器的初始状态,也是系统正常运行时大部分时间所处的状态。在此状态下,所有请求都会正常转发到下游服务或AI模型推理端点。

4.2.1 行为特征

  • 全流量通过:不对请求做任何拦截或降级处理。
  • 实时指标统计:在内存中维护一个滑动窗口(如最近60秒或最近1000次请求),持续统计请求总数、失败次数、超时次数、平均响应时间等。
  • 阈值监控:将实时指标与预设的熔断阈值进行比较。

4.2.2 触发转换的条件

当统计指标达到熔断阈值时,状态从 Closed → Open。常见的触发条件包括:

触发条件 典型阈值示例 适用场景
连续失败次数 连续5次请求失败 快速检测下游完全不可用
错误率百分比 最近60秒内错误率 > 50% 检测下游性能劣化
超时比例 最近100次请求中超时比例 > 30% 检测下游响应变慢
慢调用比例 响应时间超过2秒的请求占比 > 20% 检测模型推理延迟增加
设计建议: 对于AI模型推理场景,建议同时监控错误率和慢调用比例两个维度。模型服务可能返回200状态码但推理结果质量下降(如置信度低),此时错误率可能不高,但响应时间显著增加,慢调用比例阈值可以提前触发熔断。

4.3 Open(开启状态)—— 熔断保护态

当熔断器进入 Open 状态,表示系统正在主动保护自身,避免对已经出现问题的下游服务造成更大的压力。

4.3.1 行为特征

  • 请求快速失败:所有发往该下游的请求立即被拒绝,不会真正发送。通常直接返回降级响应(如缓存数据、默认值)或抛出异常。
  • 启动休眠计时器:进入Open状态的同时,启动一个 sleepWindow(休眠窗口) 计时器。在计时器到期之前,状态不会改变。
  • 零流量穿透:在Open状态下,下游服务获得完全的“喘息”时间,可以恢复或处理积压。

4.3.2 触发转换的条件

当 sleepWindow 超时 后,状态从 Open → Half-Open。

参数 说明 推荐值(模型推理场景)
sleepWindow 熔断后等待的时间,之后才允许试探 10 ~ 60 秒
maxRetryAttempts 在Open状态下是否允许重试(通常不允许) 0(不允许重试)
注意: sleepWindow 不宜设置过短(如 < 5秒),否则下游服务可能来不及恢复,导致频繁在 Open 和 Half-Open 之间震荡;也不宜设置过长(如 > 5分钟),否则会长时间拒绝合法请求,影响用户体验。对于模型推理服务,建议从 30 秒开始调优。

4.4 Half-Open(半开状态)—— 试探恢复态

Half-Open 是熔断器从“保护”向“恢复”过渡的关键状态。它允许有限数量的请求通过,以探测下游服务是否已经恢复正常。

4.4.1 行为特征

  • 有限放行:只允许预设数量的 探测请求(probe requests) 通过。通常设置为 1 ~ 5 个请求。
  • 并发控制:探测请求通常是串行或严格控制并发数的,避免瞬间冲击下游。
  • 结果判定:根据探测请求的成功/失败情况,决定下一步状态转换。

4.4.2 触发转换的条件

Half-Open 状态有两个出口:

探测结果 转换目标 条件说明
探测请求全部成功 Half-Open → Closed 连续 N 个探测请求均成功(如连续3次成功),认为下游已恢复,熔断器关闭,恢复正常流量。
任意探测请求失败 Half-Open → Open 只要有一个探测请求失败或超时,立即认为下游仍未恢复,重新进入Open状态,并重置sleepWindow计时器。
Half-Open 状态内部决策流程 Half-Open 状态 放行 N 个探测请求 全部成功? 是 Closed 否 Open 关键参数: • probeCount: 3 • probeTimeout: 2s

4.5 状态转换条件总结

下表汇总了三个状态之间的所有转换路径及其触发条件:

当前状态 转换条件 目标状态 转换后的动作
Closed 失败次数/错误率/慢调用比例达到阈值 Open 启动 sleepWindow 计时器,开始拒绝请求
Open sleepWindow 超时 Half-Open 允许有限数量的探测请求通过
Half-Open 所有探测请求成功 Closed 重置所有计数器,恢复正常流量
Half-Open 任意探测请求失败 Open 重置 sleepWindow,继续拒绝请求

4.6 状态机在模型发布场景中的特殊考量

模型发布时的熔断状态机调优建议:

  • 灰度发布与 Half-Open 结合:在模型新版本上线时,可以将 Half-Open 的探测请求视为“金丝雀请求”。如果新模型版本推理质量差或延迟高,探测请求失败,熔断器立即回到 Open 状态,阻止流量进入新版本,实现自动回滚。
  • Closed 状态的指标窗口要足够大:模型推理的负载模式可能与普通API不同,存在突发流量。建议滑动窗口大小至少覆盖 2~5 分钟的请求量,避免因瞬时抖动误触发熔断。
  • Open 状态的降级响应:在 Open 状态下,建议返回 降级模型版本 的推理结果(如使用上一个稳定版本的缓存结果),而不是直接返回错误,保证业务连续性。