写点什么

Hystrix- 技术专题 - 基础运作原理

发布于: 2020 年 12 月 25 日
Hystrix-技术专题-基础运作原理

熔断错误信息:

出现这个错误是由于在10秒内超过20个请求,并且这些请求超过50%都失败了,此时熔断器就打开了,默认5秒内拒绝所有请求,看这个描述跟我们遇到的情况一直,于是就按照给出的解决方式先改了在观察观察。

解决方案是:

将默认的请求阈值调高

hystrix.command.default.circuitBreaker.requestVolumeThreshold=500

将thread pool的数目调高

hystrix.threadpool.default.coreSize=100

hystrix.threadpool.default.maximumSize=200

把timeout的值调高

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=300000

ribbon.ConnectTimeout=300000

ribbon.ReadTimeout=300000

把这些配置修改后刷新配置就好了,到目前为止运行还正常,没有问题,说明这个修改起作用了。

配置

Hystrix包括HystrixCommandPropertiesHystrixThreadPoolProperties两个配置类。

HystrixCommandProperties是以hystrix.command开头的配置

默认属性值

构造函数调用getProperty方法来赋值

getProperty方法

HystrixThreadPoolProperties是以hystrix.threadpool开头的配置

默认属性值

同样是调用getProperty去赋值

流程

配置了解后,在看一下hystrix的执行流程,下面这张图是hystrix官方的执行流程图

流程说明:

每次调用创建一个新的HystrixCommand或者HystrixObservableCommand,把依赖调用封装在run()方法中执行execute()/queue() 或者 observe()/toObservable()做同步或异步调用判断请求是否有缓存,如果有缓存,直接返回缓存中的response。

判断熔断器是否打开,进行降级策略,否则继续后续步骤判断线程池/信号量是否已满,如果跑满进入降级。

后续步骤调用HystrixCommand的run方法,执行依赖逻辑,如果执行失败或者超时,则跳到进行降级策略计算熔断器状态,所有的运行状态上报给熔断器,用于统计判断熔断器状态getFallback()降级逻辑。

下面四种情况将触发getFallback调用:

run()方法抛出非HystrixBadRequestException异常;

run()方法调用超时;

熔断器开启拦截调用;

线程池/信号量是否已满;

返回执行成功结果隔离策略

hystrix有线程和信号量两种隔离策略

1、线程隔离

把执行逻辑的线程与请求线程分离,这样就是一个异步的过程,请求线程可以控制返回的时间。既然是线程隔离,就可以通过配置线程池的大小来控制并发量,当线程池配置过小时,那么线程池就会很快被填满,从而很快拒绝服务;如果线程池配置过大,就会有大量线程阻塞,影响服务器。

2、信号量隔离

信号隔离用于限制并发访问,可以防止阻塞扩散,它与线程隔离最大的不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请)。如果能明确知道执行逻辑代码能过快速返回,那么可以使用信号量隔离来代替线程隔离,降低开销。

3、总结

线程隔离与信号量隔离的区别

官方图

一般在涉及到网络请求、服务间rpc调用或者比较耗时的操作时,最好是使用线程隔离策略,这样可以保证大量的容器(tomcat)线程可用,不会由于服务原因,一直处于阻塞或等待状态,快速失败返回。

而在处理一些响应速度快的操作或者不涉及外部依赖的操作时,可以使用信号量隔离策略,这样减少了线程切换的一些开销。



用户头像

我们始于迷惘,终于更高的迷惘. 2020.03.25 加入

一个酷爱计算机技术、健身运动、悬疑推理的极客狂人,大力推荐安利Java官方文档:https://docs.oracle.com/javase/specs/index.html

评论

发布
暂无评论
Hystrix-技术专题-基础运作原理