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包括HystrixCommandProperties和HystrixThreadPoolProperties两个配置类。
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)线程可用,不会由于服务原因,一直处于阻塞或等待状态,快速失败返回。
而在处理一些响应速度快的操作或者不涉及外部依赖的操作时,可以使用信号量隔离策略,这样减少了线程切换的一些开销。
评论