本文目录导读:

熔断器的状态转换通常指的是断路器模式(Circuit Breaker Pattern),这是一种在微服务、分布式系统或电气工程中用于防止级联故障的设计模式。
在软件系统(特别是微服务架构)中,熔断器的核心状态有三种,并形成一个有限状态机:
核心三种状态及转换
-
关闭状态
- 初始/正常状态。
- 行为:允许请求通过,正常调用远程服务,内部维护一个失败计数器。
- 何时转换:当连续失败次数达到预设阈值(如10秒内失败5次),状态跳转为打开状态。
-
打开状态
- 故障阻断状态。
- 行为:所有请求立即被拒绝(快速失败),不实际调用远程服务,直接返回错误或降级响应,这给下游服务恢复的时间。
- 何时转换:经过一个预设的休眠时间(如30秒)后,状态自动跳转为半开状态,如果半开时请求再次失败,立即跳回打开状态。
-
半开状态
- 试探/恢复状态。
- 行为:允许有限数量的请求(通常是一个或几个)通过,试探远程服务是否已恢复。
- 何时转换:
- -> 关闭:试探请求全部成功,则判定服务已恢复,重置计数器,状态跳转为关闭状态。
- -> 打开:即使只有一个试探请求失败,则判定服务仍未恢复,状态立刻跳转回打开状态,并重置休眠计时器。
状态转换图(文字版)
[关闭状态] --(连续失败数>=阈值)--> [打开状态] [打开状态] --(休眠时间到期)-----> [半开状态] [半开状态] --(试探请求成功)-----> [关闭状态] [半开状态] --(试探请求失败)-----> [打开状态]
其他相关边界状态(可选)
在某些高级实现或讨论中,还会涉及以下两个状态,可以看作是主状态内部的一种细分:
- 强制打开:系统管理员手动禁止所有请求,无视任何恢复尝试,此时即使休眠时间到,也不会进入半开。
- 强制关闭:系统管理员手动强制熔断器永不打开,所有请求都通过,这在调试期间或临时扩容时可能使用,但风险很高。
关键阈值与参数
理解状态转换,需要关注几个核心参数:
failureThreshold(失败阈值):关闭状态下,触发跳转到打开所需的最小连续失败数或失败率(如10秒内50%的请求失败)。successThreshold(成功阈值):半开状态下,认为服务已恢复所需的最小试探成功请求数(通常是1)。timeout或sleepWindow(休眠/超时窗口):从打开状态跳转到半开状态之前需要等待的时间(如30秒)。
现实类比:家庭电路中的漏电保护开关
- 关闭:开关合上,电流正常通过。
- 打开:检测到漏电或过载,开关跳闸,切断电路(等同于熔断器打开,阻止请求)。
- 半开:故障排查后,手动把开关推上去(等于手动发一个试探请求),如果推上去后立刻又跳闸,说明电路仍有故障(状态回到打开);如果推上去后不再跳闸,说明故障排除(状态回到关闭)。
| 状态 | 是否允许请求通过? | 行为 | 触发条件(转换方向) |
|---|---|---|---|
| 关闭 | 是 | 正常调用,统计失败次数 | (初始) -> 失败超标 -> 打开 |
| 打开 | 否 | 快速失败,等待休眠 | 失败超标 -> 超时到期 -> 半开 |
| 半开 | 否 (仅限试探) | 尝试1个请求 | 试探成功 -> 关闭;试探失败 -> 打开 |
这个状态转换模型在任何现代微服务框架(如 Resilience4j, Hystrix, Spring Cloud Circuit Breaker)中都是核心概念。