2. Circuit Breaker 模式原理:状态机模型与核心指标

Circuit Breaker(断路器)是一种防止级联故障的弹性设计模式。其核心思想是通过一个有限状态机,在调用远程资源时自动检测故障率,当故障达到阈值时快速切断调用链路,避免资源耗尽和雪崩效应。本节深入剖析其状态机模型与三个核心指标。

2.1 三态状态机模型

Circuit Breaker 维护三个状态:Closed(关闭)、Open(打开)、Half-Open(半开)。状态转换由故障计数、超时和熔断时间驱动。

核心原则: 正常时处于 Closed;故障率超阈值则跳转为 Open,拒绝所有请求;经过熔断时间后进入 Half-Open,允许少量探测请求,若成功则恢复 Closed,若失败则回到 Open。
Circuit Breaker 三态状态机转换图 Closed 正常调用,计数故障 Open 快速失败,拒绝请求 Half-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. 探测请求数量: 通常只允许 1 个或少量请求通过(如 3 个),避免瞬时压垮恢复中的下游。
  2. 成功判定: 所有探测请求成功 → 转入 Closed;任一探测请求失败 → 立即回到 Open,并重置熔断计时器。
  3. 超时处理: 探测请求同样受超时约束,超时视为失败。
Half-Open 探测决策流程 进入 Half-Open 发送 N 个探测请求 全部成功 → Closed 任一失败 → Open N 通常为 1~3,避免探测流量压垮恢复中的下游服务

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 平衡响应速度与稳定性