断路器模式
源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
断路器示意图
SpringCloud Netflix实现了断路器库的名字叫Hystrix
. 在微服务架构下,通常会有多个层次的服务调用. 下面是微服架构下, 浏览器端通过API访问后台微服务的一个示意图:
一个微服务的超时失败可能导致瀑布式连锁反映,下图中,Hystrix
通过自主反馈实现的断路器, 防止了这种情况发生。
图中的服务B因为某些原因失败,变得不可用,所有对服务B的调用都会超时。当对B的调用失败达到一个特定的阀值(5秒之内发生20次失败是Hystrix
定义的缺省值), 链路就会被处于open状态, 之后所有所有对服务B的调用都不会被执行, 取而代之的是由断路器提供的一个表示链路open的Fallback
消息. Hystrix
提供了相应机制,可以让开发者定义这个Fallbak
消息.
open
的链路阻断了瀑布式错误, 可以让被淹没或者错误的服务有时间进行修复。这个fallback
可以是另外一个Hystrix
保护的调用, 静态数据,或者合法的空值. Fallbacks
可以组成链式结构,所以,最底层调用其它业务服务的第一个Fallback
返回静态数据.