spring cloud | Hystrix断路器是如何工作的

Hystrix是什么
Hystrix是一个java类库,提供了服务容错保护

遇到的问题
请求响应时间过长,造成资源不能被及时释放。短时巨量请求造成资源耗尽,最终造成系统无法响应。
系统中一个服务服务出现故障,影响其他系统,造成系统级联故障。
请求不受约束或者未进行批处理,系统会逐渐变慢失去响应 注 (资源可能是,线程,网络连接,内存等)
Hystrix解决方案
超时后取消与外部服务的连接;释放系统资源,并使系统响应 线程和网络使用受到线程池和信号量的限制。
当资源消耗到它们的约束时,之后的请求将失败,而不是排队
当发生故障时,可以在适当的时候使用fallback;
可以使用批处理请求;更有效地利用本地及外来服务资源
工作流程

官方工作流程图一共9步如下,逻辑简单。

创建对象HystrixCommand和HystrixObservableCommand对象
命令执行
缓存中是否有结果
断路器是否打开
信号量/线程池是否拒绝
HystrixObservableCommand.construct()或者HystrixCommand.run()
计算断路器的健康度
fallback处理
返回成功的响应
断路器原理

其原理说明如下:

假设请求量达到一定的阈值(HystrixCommandProperties.circuitBreakerRequestVolumeThreshold())
假设错误百分比超过阈值错误百分比 (HystrixCommandProperties.circuitBreakerErrorThresholdPercentage())
满足其一,打开断路器。
当短路其打开,短路所有进过该短路器的请求。
一段时间后(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()), 允许一个请求通过(此时短路器为半开状态),如果该请求成功,短路其设置为打开,否则将短路器设置为关闭,从1开始再进行判断。
依赖隔离
Hystrix使用“舱壁模式”。默认使用线程池。 为每一个依赖服务创建一个独立的线程池,这样如果一个依赖服务出现故障,只对该依赖服务的调用产生影响,不会拖累其他服务。如下图所示:

线程池隔离优点

当服务从失效恢复正常后,线程池会被清理,马上恢复健康的服务,而容器级别要满很多。

失败次数,延迟,超时,拒绝等指标,会快速反应出问题,结合Spring Cloud 可以实现动态刷新。

线程池内置了并发实现,为同步依赖服务构建异步访问。

请求合并
解决,通信占用和连接消耗问题。在一个很短的时间窗口(默认10ms)内对多个请求进行合并以批处理的方式发送请求。 缺点:

造成单个响应的延迟,如果单个响应是5ms,默认时间窗口是10ms,这个请求的响应就变为了15ms
用户需要实现批量化服务和处理,增加了一些成本。 请求合并示意图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值