1. 熔断器基础概念
1.1 熔断器模式起源:从电路到软件
熔断器(Circuit Breaker)模式最早源于电气工程——当电路过载或短路时,保险丝熔断以切断电流,保护后端设备不被烧毁。2014 年,Michael Nygard 在《Release It!》中正式将这一思想引入分布式系统设计,用于解决微服务调用链中的级联故障问题。
核心类比:电气熔断器保护灯泡不被浪涌电流烧坏;软件熔断器保护下游服务不被上游的异常流量压垮。
在微服务架构中,服务间通过 RPC 或 HTTP 进行同步调用。当某个下游服务出现延迟或错误时,上游服务若持续重试,会迅速耗尽线程池和连接池,最终导致整个调用链雪崩。熔断器模式通过监控调用失败率,在达到阈值时自动“断开”请求通道,让上游快速失败而非阻塞等待。
1.2 核心三状态:Closed / Open / Half-Open
熔断器是一个有限状态机,包含三个核心状态。理解三状态的流转是校准熔断参数的前提。
| 状态 | 含义 | 行为 | 触发条件 |
|---|---|---|---|
| Closed(关闭) | 熔断器闭合,请求正常通过 | 正常转发请求,统计失败率 | 初始状态;失败率低于阈值时保持 |
| Open(断开) | 熔断器断开,请求被快速拒绝 | 直接返回降级响应或异常,不发起真实调用 | 失败率超过阈值(如 50%) |
| Half-Open(半开) | 熔断器半开,试探下游是否恢复 | 允许少量探测请求通过,根据结果决定状态迁移 | Open 状态持续超时时间后自动进入 |
状态流转规则:
- Closed → Open:失败率 ≥ 阈值(如 50%)且请求量 ≥ 最小请求数(如 5)
- Open → Half-Open:等待超时时间(如 10 秒)后自动进入
- Half-Open → Closed:探测请求成功率达到阈值(如 100%)
- Half-Open → Open:探测请求失败,立即回到 Open 并重置计时器
1.3 熔断器在微服务中的价值
熔断器不是简单的“失败重试”,而是一种系统自我保护与依赖隔离的机制。在微服务拓扑中,一个服务通常依赖多个下游服务,熔断器在以下场景中发挥关键作用:
- 防止级联故障(Cascading Failure):下游服务 A 故障 → 上游 B 线程阻塞 → B 的调用方 C 也阻塞,最终整个调用链崩溃。熔断器在 B 层切断请求,阻断故障传播。
- 快速失败与降级:熔断器 Open 后,上游立即返回降级响应(如缓存数据、默认值、错误提示),避免用户长时间等待。
- 自动恢复探测:Half-Open 状态允许系统在无人工干预的情况下,自动探测下游是否恢复,降低运维成本。
- 资源隔离:熔断器通常配合线程池隔离或信号量隔离,为每个依赖分配独立资源池,避免一个依赖耗尽所有线程。
常见误区:熔断器不等于重试机制。重试用于临时网络抖动,熔断器用于持续故障。两者应配合使用:先熔断,熔断期间不重试;Half-Open 探测成功后再恢复重试策略。
1.4 熔断器 vs 重试 vs 限流
熔断器常与重试、限流配合使用,但三者职责不同。下表帮助区分:
| 机制 | 目标 | 触发条件 | 典型动作 | 适用场景 |
|---|---|---|---|---|
| 熔断器 | 防止级联故障 | 失败率超过阈值 | 断开请求,快速失败 | 下游持续故障或超时 |
| 重试 | 提高临时故障容错 | 请求失败(网络抖动) | 间隔重试 1~3 次 | 瞬时错误、超时重试 |
| 限流 | 保护自身不被流量冲垮 | QPS 超过阈值 | 拒绝或排队请求 | 流量突增、DoS 攻击 |
最佳实践:在微服务网关或 RPC 客户端侧,按以下顺序组合:限流 → 熔断 → 重试。先限流保护自身,再熔断保护下游,最后对允许通过的请求做有限重试。