Hystrix系列之熔断器实现原理

栏目: 服务器 · 发布时间: 6年前

内容简介:在生活中,如果电路的负载过高,保险箱会自动跳闸,以保护家里的各种电器,这就是熔断器的一个活生生例子。在Hystrix中也存在这样一个熔断器,当所依赖的服务不稳定时,能够自动熔断,并提供有损服务,保护服务的稳定性。在运行过程中,Hystrix会根据接口的执行状态(成功、失败、超时和拒绝),收集并统计这些数据,根据这些信息来实时决策是否进行熔断。Hystrix的熔断器实现在熔断器是否启用,默认是

在生活中,如果电路的负载过高,保险箱会自动跳闸,以保护家里的各种电器,这就是熔断器的一个活生生例子。在Hystrix中也存在这样一个熔断器,当所依赖的服务不稳定时,能够自动熔断,并提供有损服务,保护服务的稳定性。在运行过程中,Hystrix会根据接口的执行状态(成功、失败、超时和拒绝),收集并统计这些数据,根据这些信息来实时决策是否进行熔断。

相关参数

Hystrix的熔断器实现在 HystrixCircuitBreaker 类中,比较重要的几个参数如下:

1、circuitBreaker.enabled

熔断器是否启用,默认是 true

2、circuitBreaker.forceOpen

熔断器强制打开,始终保持打开状态,默认是 false

3、circuitBreaker.forceClosed

熔断器强制关闭,始终保持关闭状态,默认是 false

4、circuitBreaker.requestVolumeThreshold

滑动窗口内(10s)的请求数阈值,只有达到了这个阈值,才有可能熔断。默认是 20 ,如果这个时间段只有19个请求,就算全部失败了,也不会自动熔断。

5、circuitBreaker.errorThresholdPercentage

错误率阈值,默认 50% ,比如(10s)内有100个请求,其中有60个发生异常,那么这段时间的错误率是 60 ,已经超过了错误率阈值,熔断器会自动打开。

6、circuitBreaker.sleepWindowInMilliseconds

熔断器打开之后,为了能够自动恢复,每隔默认 5000ms 放一个请求过去,试探所依赖的服务是否恢复。

工作原理

详细过程如下:

Hystrix系列之熔断器实现原理

来自Hystrix官网

在最新代码中,因为一些bug,已经弃用了 allowRequest() ,取而代之的是 attemptExecution() 方法。

Hystrix系列之熔断器实现原理

allowRequest() 方法相比,唯一改进的地方是通过 compareAndSet 修改状态值。通过 attemptExecution() 方法的返回值决定执行正常逻辑,还是降级逻辑。

1、如果 circuitBreaker.forceOpen=true ,说明熔断器已经强制开启,所有请求都会被熔断。

2、如果 circuitBreaker.forceClosed =true ,说明熔断器已经强制关闭,所有请求都会被放行。

3、 circuitOpened 默认 -1 ,用以保存最近一次发生熔断的时间戳。

4、如果 circuitOpened 不等于 -1 ,说明已经发生熔断,通过 isAfterSleepWindow() 判断当前是否需要进行试探。

Hystrix系列之熔断器实现原理

这里就是熔断器自动恢复的逻辑,如果当前时间已经超过上次熔断的时间戳 + 试探窗口 5000ms ,则进入if分支,通过compareAndSet修改变量 status ,竞争试探的能力。其中 status 代表当前熔断器的状态,包含 CLOSED, OPEN, HALF_OPEN ,只有试探窗口之后的第一个请求可以执行正常逻辑,且修改当前状态为 HALF_OPEN ,进入半熔断状态,其它请求执行 compareAndSet(Status.OPEN, Status.HALF_OPEN) 时都返回false,执行降级逻辑。

5、如果试探请求发生异常,则执行 markNonSuccess()

Hystrix系列之熔断器实现原理

通过 compareAndSet 修改 status 为熔断开启状态,并更新当前熔断开启的时间戳。

6、如果试探请求返回成功,则执行 markSuccess()

Hystrix系列之熔断器实现原理

通过 compareAndSet 修改 status 为熔断关闭状态,并重置接口统计数据和 circuitOpened 标识为 -1 ,后续请求开始执行正常逻辑。

说了这么多,如何实现自动熔断还没提到,在Hystrix内部有一个Metric模块,专门统计每个Command的执行状态,包括成功、失败、超时、线程池拒绝等,在熔断器的中 subscribeToStream() 方法中,通过订阅数据流变化,实现函数回调,当有新的请求时,数据流发生变化,触发回调函数 onNext

Hystrix系列之熔断器实现原理

onNext 方法中,参数 hc 保存了当前接口在前10s之内的请求状态(请求总数、失败数和失败率),其主要逻辑是判断请求总数是否达到阈值 requestVolumeThreshold ,失败率是否达到阈值 errorThresholdPercentage ,如果都满足,说明接口的已经足够的不稳定,需要进行熔断,则设置 status 为熔断开启状态,并更新 circuitOpened 为当前时间戳,记录上次熔断开启的时间。


以上所述就是小编给大家介绍的《Hystrix系列之熔断器实现原理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Programming in Java

Introduction to Programming in Java

Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00

By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试