什么是服务熔断
熔断其实可以理解为类似于电表的保险丝,一旦某个时刻电压过载,那么保险丝就熔断了。
同样这个场景被应用到了互联网系统中,比如:当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用,这就是服务熔断。
为什么需要服务熔断
1.服务正常时候
我们来看一个例子,这样就更容易理解服务熔断的机制了。
比如:当前系统中有A B C三个服务,服务A是上游,服务B是中游,服务C是下游。
它们的调用链,如下图所示:
2.服务异常的时候
服务正常的时候一切都还好,但是如果遇到突发情况,服务C因某些原因变得不可用。
这样就会造成大量请求被积压,服务B的请求线程也随之阻塞,线程资源逐渐耗尽,使得服务B也变得不可用,紧接着服务A也变为不可用,整个调用链路被拖垮。
最后就会出现雪崩的场景,如下图所示:
在这种时候,就需要我们的熔断机制来挽救整个系统。
服务熔断机制原理
服务熔断的实现,大体流程如下图所示:
对于熔断机制的实现,设计了三种状态:
1.熔断关闭状态(Closed)
服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制。
2.熔断开启状态(Open)
在固定时间窗口内,比如:默认10秒,接口调用出错比率达到一个阈值,会进入熔断开启状态,进入熔断状态后,后续对该服务接口的调用不再经过网络。
3.半熔断状态(Half-Open)
在进入熔断开启状态一段时间之后,比如:Hystrix默认5秒,熔断器会进入半熔断状态。
所谓半熔断就是尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率,如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态。
如果成功率仍旧很低,则重新进入熔断关闭状态。
服务熔断组件
目前使用服务熔断组件,主要有以下4种:
- hystrix circuit breaker(不再维护);
- hystrix-go;
- resilience4j(推荐);
- sentinel(推荐);
目前主流推荐使用Sentinel来实现服务熔断,如果想更加全面的了解Sentinel,请查看Sentinel(从入门到精通详细图解)。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》