2. Circuit Breaker 模式原理:状态机模型与核心指标
Circuit Breaker(断路器)是一种防止级联故障的弹性设计模式。其核心思想是通过一个有限状态机,在调用远程资源时自动检测故障率,当故障达到阈值时快速切断调用链路,避免资源耗尽和雪崩效应。本节深入剖析其状态机模型与三个核心指标。
2.1 三态状态机模型
Circuit Breaker 维护三个状态:Closed(关闭)、Open(打开)、Half-Open(半开)。状态转换由故障计数、超时和熔断时间驱动。
核心原则: 正常时处于 Closed;故障率超阈值则跳转为 Open,拒绝所有请求;经过熔断时间后进入 Half-Open,允许少量探测请求,若成功则恢复 Closed,若失败则回到 Open。
2.2 核心指标详解
Circuit Breaker 的行为由三个关键参数控制,下表列出每个指标的定义、典型值及调优建议。
| 指标 | 定义 | 典型值 | 调优方向 |
|---|---|---|---|
| 失败阈值 | 在滑动时间窗口内,触发熔断所需的最小失败次数或失败率 | 5 次 或 50% 失败率 | 根据业务容忍度调整;高并发服务可适当提高次数阈值 |
| 超时 | 单次请求的最大等待时间,超时即视为失败 | 500ms ~ 3s | 基于 P99 延迟设定,避免过长超时阻塞线程池 |
| 熔断时间 | 断路器保持在 Open 状态的时长,之后进入 Half-Open | 5s ~ 30s | 根据下游恢复速度设定;过短导致频繁探测,过长降低可用性 |
2.3 滑动窗口与失败计数
失败阈值通常基于滑动时间窗口计算,而非全局累计。常见实现方式有两种:
- 计数窗口(Count-based): 统计最近 N 次调用中的失败次数。例如最近 10 次调用中失败 5 次则熔断。
- 时间窗口(Time-based): 统计最近 T 秒内的失败次数。例如最近 10 秒内失败 5 次则熔断。
实践建议: 时间窗口更适合流量波动大的场景,计数窗口更适合稳定流量场景。Resilience4j 默认使用时间窗口 + 最小调用次数(minimumNumberOfCalls)的组合策略。
2.4 Half-Open 探测机制
Half-Open 是状态机的关键恢复阶段。其设计要点包括:
- 探测请求数量: 通常只允许 1 个或少量请求通过(如 3 个),避免瞬时压垮恢复中的下游。
- 成功判定: 所有探测请求成功 → 转入 Closed;任一探测请求失败 → 立即回到 Open,并重置熔断计时器。
- 超时处理: 探测请求同样受超时约束,超时视为失败。
2.5 状态转换与指标联动示例
以下代码片段展示了一个简化版 Circuit Breaker 状态机逻辑,使用 Java 伪代码实现核心转换条件:
public class CircuitBreaker {
private State state = State.CLOSED;
private int failureCount = 0;
private long lastFailureTime;
private static final int FAILURE_THRESHOLD = 5;
private static final long TIMEOUT_MS = 1000;
private static final long OPEN_TIMEOUT_MS = 10000;
public boolean allowRequest() {
switch (state) {
case CLOSED:
return true;
case OPEN:
if (System.currentTimeMillis() - lastFailureTime > OPEN_TIMEOUT_MS) {
state = State.HALF_OPEN;
return true; // 允许探测
}
return false;
case HALF_OPEN:
return true; // 限制并发数由调用方控制
default:
return false;
}
}
public void onFailure() {
failureCount++;
lastFailureTime = System.currentTimeMillis();
if (state == State.HALF_OPEN || failureCount >= FAILURE_THRESHOLD) {
state = State.OPEN;
}
}
public void onSuccess() {
if (state == State.HALF_OPEN) {
state = State.CLOSED;
failureCount = 0;
}
}
}
注意: 生产级实现(如 Resilience4j、Hystrix)还需考虑滑动窗口重置、并发安全、线程池隔离等复杂逻辑。上述代码仅为状态机核心逻辑演示,不可直接用于生产。
2.6 核心指标配置对照表
不同场景下,三个核心指标的推荐配置差异较大。下表给出典型业务场景的参考值:
| 场景 | 失败阈值 | 超时 | 熔断时间 | 说明 |
|---|---|---|---|---|
| 高可用核心服务 | 3 次 / 10s | 500ms | 10s | 快速熔断,快速恢复 |
| 非关键批量任务 | 10 次 / 30s | 3s | 30s | 容忍短暂抖动,减少误熔断 |
| 第三方 API 调用 | 5 次 / 20s | 2s | 15s | 平衡响应速度与稳定性 |