4. 熔断状态机详解:Closed、Open、Half-Open 及状态转换条件
熔断器(Circuit Breaker)的核心是一个三态状态机。理解这三个状态及其转换条件,是设计稳定API熔断策略的基础。每个状态都对应着不同的流量处理策略和系统保护目标。
4.1 三态状态机总览
熔断器在 Closed(关闭)、Open(开启) 和 Half-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计时器。 |
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 状态下,建议返回 降级模型版本 的推理结果(如使用上一个稳定版本的缓存结果),而不是直接返回错误,保证业务连续性。