本文目录导读:

熔断器(Circuit Breaker,也称为断路器或保险丝)的状态转换通常遵循一个有限状态机模型,在电路保护或分布式系统的熔断机制中,其核心状态和转换逻辑如下:
核心状态
- 闭合状态:这是正常工作状态,电流/请求正常通过,当电路中的电流超过额定值或系统出现故障时,会触发下一次状态转换。
- 断开状态:这是保护状态,熔断器已断开电路,阻止电流/请求通过,以保护后端系统,此时系统会快速失败或执行降级逻辑。
- 半开状态:这是一个试探性状态,在断开状态持续一段时间后,熔断器允许少量请求通过,以测试系统是否已恢复。
状态转换流程
状态转换图如下:
+---------+ 故障/过载 +---------+
| 闭合 | ------------------> | 断开 |
| (Close) | | (Open) |
+---------+ +---------+
^ |
| | 超时等待
| v
| +----------+
+--------------------- | 半开 |
恢复成功 (重置) | (Half-Open)|
+----------+
|
| 恢复失败 (再次故障)
v
+---------+
| 断开 | (再次回到断开)
+---------+
详细转换条件:
-
闭合→断开:
- 触发条件:在物理熔断器中,电流超过额定值并持续一定时间(热积累),在软件熔断器中,通常是错误率或错误计数超过预设阈值(最近10秒内50%的请求失败)。
- 动作:物理熔断器的熔体熔化,或软件熔断器开始拒绝所有后续请求,并启动一个“超时计时器”。
-
断开→半开:
- 触发条件:计时器超时,这是自动触发的,无需外部干预,超时时间通常根据业务场景配置(30秒、1分钟)。
- 动作:熔断器进入半开状态,并允许一个或少量试探性请求通过。
-
半开→闭合:
- 触发条件:试探性请求成功(返回了正常的HTTP 200响应,且响应时间在合理范围内)。
- 动作:确认系统已恢复,熔断器重置计数器,回到闭合状态,恢复正常流量。
-
半开→断开:
- 触发条件:试探性请求失败(返回了超时或500错误)。
- 动作:表明系统仍存在问题,熔断器立即回到断开状态,并重新启动计时器(通常计时器时间可以指数级递增,以避免反复试探)。
物理熔断器 vs. 软件熔断器
- 物理熔断器:状态转换是单向的(闭合→断开),一旦熔断,无法自动恢复,需要手动更换保险丝。“半开”状态在物理熔断器中通常不存在(除非是自动恢复式断路器)。
- 软件熔断器(如 Hystrix、Resilience4j、Sentinel):支持完整的闭合→断开→半开→闭合/断开循环,且可通过配置灵活调整阈值、超时时间和试探逻辑。
常见误区与补充
- “重置”不是独立状态:闭合→断开的过程之后,需要通过 半开状态 的测试才能回到闭合。“重置”通常指手动或自动将断开状态强制转换回闭合(如物理更换保险丝),但在标准的软件熔断模型中,这必须通过半开状态过渡。
- 状态记忆:处于断开状态时,熔断器会记录“失败计数”或“时间窗口”,但这些不构成独立的状态。
| 当前状态 | 触发事件 | 下一状态 | 效果 |
|---|---|---|---|
| 闭合 | 故障/过载 | 断开 | 保护系统,拒绝请求 |
| 断开 | 计时器超时 | 半开 | 试探系统是否恢复 |
| 半开 | 试探成功 | 闭合 | 恢复正常流量 |
| 半开 | 试探失败 | 断开 | 继续保护,等待下次试探 |
如果你是在问某个具体实现(如 Spring Cloud Circuit Breaker、Netflix Hystrix 或 Alibaba Sentinel)的状态转换细节,其核心逻辑与此一致,但参数配置(如错误阈值、超时时间等)会有所不同。