熔断器三态模型:Closed / Open / Half-Open
熔断机制的核心是一个有限状态机,即熔断器三态模型。该模型定义了三个稳定状态(Closed、Open、Half-Open)以及它们之间的转换条件。理解这一模型是设计弹性系统的基石。
核心概念:熔断器并非二进制开关(开/关),而是通过第三个中间状态(Half-Open)实现自动恢复探测,避免在故障未恢复时盲目放行请求,也避免在恢复后长期拒绝流量。
三态定义与转换条件总览
| 状态 | 含义 | 默认行为 | 转换触发条件 |
|---|---|---|---|
| Closed(关闭) | 熔断器闭合,请求正常通过 | 正常调用下游,统计失败率/超时率 | 初始状态;失败率未达阈值 |
| Open(打开) | 熔断器断开,请求被快速失败 | 直接返回降级响应或抛出异常,不发起真实调用 | 失败率超过阈值 → 从 Closed 转换 |
| Half-Open(半开) | 熔断器半开,允许少量探测请求通过 | 放行一个或一小批请求,测试下游是否恢复 | Open 状态持续超时时间 → 自动进入 |
状态转换条件详解
-
Closed → Open
当熔断器处于 Closed 状态时,持续统计最近一个时间窗口(如 10 秒)内的请求失败率。若失败率超过预设阈值(如 50%),且请求量达到最小请求数(如 5 次),则熔断器跳转为 Open 状态。此时所有后续请求立即失败,不再调用下游。
避坑提示:阈值设置需考虑业务容忍度。过低(如 10%)容易误触发;过高(如 90%)则保护滞后。建议结合超时时间与错误类型(5xx vs 网络超时)综合判定。 -
Open → Half-Open
熔断器进入 Open 状态后,会启动一个休眠计时器(如 30 秒)。计时器到期后,熔断器自动进入 Half-Open 状态。此转换是时间驱动的,不依赖外部请求。
-
Half-Open → Closed 或 Open
在 Half-Open 状态下,熔断器允许有限数量的探测请求通过(通常为 1 个)。若探测请求成功(响应正常),则认为下游已恢复,熔断器重置为 Closed 状态,并清零统计计数器。若探测请求失败,熔断器立即回到 Open 状态,并重置休眠计时器。
关键设计:Half-Open 状态下的探测请求数量必须严格控制。过多探测请求可能压垮正在恢复的下游;过少则可能因单次抖动导致误判。推荐使用“单次探测 + 连续成功次数”策略。
熔断器三态转换流程图
状态转换参数配置清单
| 参数名称 | 典型值 | 作用阶段 | 说明 |
|---|---|---|---|
| 滑动窗口大小 | 10 秒 | Closed | 统计最近 N 秒内的请求总数与失败数 |
| 最小请求数 | 5 | Closed → Open | 窗口内请求量低于此值时不触发熔断,避免冷启动误判 |
| 失败率阈值 | 50% | Closed → Open | 失败请求占比超过此值时触发熔断 |
| 休眠超时时间 | 30 秒 | Open → Half-Open | 熔断后等待多久才允许探测 |
| 探测请求数 | 1 | Half-Open | 半开状态下允许通过的请求数量 |
| 连续成功次数 | 1 | Half-Open → Closed | 探测请求连续成功多少次后关闭熔断器 |
三态模型在分布式系统中的意义
- Closed 状态:提供正常服务,同时通过滑动窗口实时监控健康度,是系统的“常态”。
- Open 状态:快速失败,保护下游不被持续重试压垮,同时为上游提供明确的降级信号。
- Half-Open 状态:实现自动恢复探测,避免人工介入,是系统自愈能力的关键。
实践建议:在生产环境中,建议为熔断器配置独立的监控指标(如熔断器状态变化次数、Open 状态持续时间),并与告警系统联动。当熔断器频繁在 Open 与 Half-Open 之间震荡时,说明下游可能存在间歇性故障,需要人工排查。