Circuit Breakers [断路器]
Circuit Breaker 是什么
Circuit Breaker 的概念来源于电子工程(电流达到一定阙值时断开电路),其目的是当下游服务因压力过大而响应变慢或者出错,上游服务为了保护系统整体的可用性暂时切断对下游服务的访问。
Circuit Breaker 的作用
牺牲局部保护整体
如下有一个请求链:
ServiceA -> ServiceB -> ServiceC
如果ServiceC达到瓶颈获取故障。这时ServiceB就会有大量的请求超时而导致ServiceB阻塞大量的请求线程导致ServiceB变慢或不可用,同理进而对其上游服务产生同样的影响,最后整个系统完全瘫痪。
如果在ServiceC服务变慢或故障时,ServiceB切断对ServiceC的调用那么久不会出现上述的情景。这就是熔断器的作用。
Circuit Breaker 原理
Circuit Breaker 的原理是维护一个状态机,总共有3个状态:
- Closed 关闭状态,服务可以正常使用,当请求在一定时间内失败数量达到一定的阙值则表示服务不可用,将状态切换到Open状态。
- Open 打开状态,来自应用的请求会立即返回失败。在熔断一定时间后切换到HalfOpen状态检查服务是否恢复。
- HalfOpen 半打开状态, 仅仅允许少量的服务请求通过,如果这些请求调用都成功,表示服务已经恢复,则将其切换到Closed状态,反之如果存在服务调用有一个失败则将其切换到Open状态。
状态转换如下图所示:(图片来源))
Circuit Breaker 的golang实现
在go生态里有3个较好的实现Packages:
- github.com/sony/gobreaker
- github.com/afex/hystrix-go
- github.com/streadway/handy
下面阅读一下比较简洁的gobreaker代码
结构定义
1 | // CircuitBreaker 是一个状态机用于防止发送极可能失败的请求。 |
核心代码
1 | func (cb *CircuitBreaker) Execute(req func() (interface{}, error)) (interface{}, error) { |