3. 熔断基础:熔断器状态机(Closed/Open/Half-Open)、熔断触发条件与恢复策略
熔断器(Circuit Breaker)是分布式系统中防止级联故障的核心治理模式。其设计灵感来源于电路中的物理断路器:当电流过载时自动断开,保护整个电路不被烧毁。在微服务架构中,熔断器通过监控调用失败率,在系统不稳定时主动切断请求链路,为下游服务提供喘息恢复的时间窗口。
3.1 熔断器三态状态机
标准的熔断器状态机包含三个核心状态:Closed(关闭)、Open(打开) 和 Half-Open(半开)。这三个状态构成一个有限状态自动机,驱动熔断器在不同负载条件下自动切换。
核心原则:熔断器不是故障预防工具,而是故障隔离与恢复工具。它假设故障必然发生,重点在于如何限制故障影响范围并安全恢复。
3.2 熔断触发条件
熔断器从 Closed 切换到 Open 并非由单一指标决定,而是基于一组可配置的触发条件。以下是业界通用的触发条件体系:
| 触发条件 | 说明 | 典型阈值 | 适用场景 |
|---|---|---|---|
| 连续失败次数 | 最近 N 次调用全部失败,触发熔断 | 5 ~ 10 次 | 快速检测瞬时故障 |
| 失败率阈值 | 滑动窗口内失败请求占比超过设定值 | 50% ~ 80% | 慢速累积故障检测 |
| 超时比例 | 响应时间超过阈值的请求占比过高 | P99 > 2000ms 占比 > 30% | 服务响应退化检测 |
| 最小请求数 | 触发熔断前必须达到的最低请求量 | 10 ~ 20 次 | 避免冷启动误判 |
| 异常类型过滤 | 仅对特定异常(如超时、5xx)计数 | TimeoutException, ServerError | 区分业务异常与系统异常 |
设计要点:最小请求数(Minimum Request Threshold)是防止熔断器误触发的关键参数。在低流量时段,少量失败不应触发熔断。建议将最小请求数设置为滑动窗口内至少 10~20 次请求。
3.3 恢复策略
熔断器进入 Open 状态后,系统需要一套可靠的恢复机制来验证下游服务是否已恢复正常。恢复策略的核心在于 试探窗口 和 渐进恢复 两个维度。
3.3.1 超时窗口策略
熔断器在 Open 状态停留的时间称为超时窗口(Timeout Window)。窗口到期后,熔断器自动进入 Half-Open 状态。窗口长度的设定直接影响系统恢复速度:
- 固定窗口:每次熔断后等待固定时长(如 30 秒),实现简单但缺乏弹性。
- 指数退避窗口:首次熔断等待 10 秒,第二次 20 秒,第三次 40 秒……防止频繁试探加重下游负担。
- 自适应窗口:根据下游服务的恢复速度动态调整窗口长度,需要额外的健康探测机制。
3.3.2 试探恢复流程
Half-Open 状态下的试探恢复是熔断器最精妙的设计。它通过限制试探请求的数量和频率,在安全性和恢复速度之间取得平衡。
3.3.3 试探请求数量策略
Half-Open 状态下允许通过的试探请求数量(N 值)是恢复策略的关键参数:
- 固定数量:每次允许 1~3 个请求通过,简单但恢复速度慢。
- 比例策略:允许正常流量的 5%~10% 通过,逐步增加试探压力。
- 渐进式:首次试探 1 个请求,成功后增加至 3 个,再成功增加至 5 个,直到完全关闭熔断器。
常见陷阱:试探请求数量过多会导致下游服务在未完全恢复时再次被压垮,形成反复熔断的震荡现象。建议从 1 个试探请求开始,逐步递增。
3.4 状态机参数配置清单
以下是生产环境中熔断器状态机的典型参数配置,供架构设计时参考:
| 参数名称 | 默认值 | 推荐范围 | 说明 |
|---|---|---|---|
| failureThreshold | 5 | 3 ~ 10 | 连续失败次数阈值 |
| failureRateThreshold | 50% | 40% ~ 80% | 滑动窗口内失败率阈值 |
| slidingWindowSize | 100 | 50 ~ 200 | 滑动窗口请求计数大小 |
| minRequestThreshold | 10 | 5 ~ 20 | 触发熔断的最小请求数 |
| timeoutWindow | 30s | 10s ~ 120s | Open 状态超时窗口 |
| halfOpenMaxRequests | 3 | 1 ~ 5 | Half-Open 试探请求数 |
3.5 缓存一致性视角下的熔断器设计
在缓存一致性闭环的上下文中,熔断器不仅保护下游服务,还需要与缓存策略协同工作:
- 熔断期间缓存降级:当熔断器进入 Open 状态时,所有请求直接返回缓存中的过期数据(Stale Cache),避免请求穿透到故障服务。
- Half-Open 试探与缓存更新:试探请求成功后,立即触发缓存更新操作,将最新数据写入缓存,为后续正常请求预热。
- 熔断恢复后的缓存同步:从 Half-Open 切换到 Closed 时,需要同步清除熔断期间积累的降级标记,恢复正常的缓存读写策略。
缓存一致性闭环要点:熔断器状态变化应作为缓存策略切换的触发器。Closed 状态使用正常缓存策略(先读缓存,异步写缓存);Open 状态使用降级缓存策略(只读缓存,不写缓存);Half-Open 状态使用试探缓存策略(读缓存 + 试探写缓存)。