内容简介:前段时间我司内部晋升答辩时,有位同事的晋升PPT中说到它采用了“Hystrix信号量 + RPC CallBack + CompletableFuture”进行了性能优化,使用Hystrix主要是使用它的超时、降级、熔断等功能。不少评委提出了质疑,因为他们认为Hystrix信号量模式是不支持超时的。Talk is cheap,Show me your code信号量模式
背景
前段时间我司内部晋升答辩时,有位同事的晋升PPT中说到它采用了“Hystrix信号量 + RPC CallBack + CompletableFuture”进行了性能优化,使用Hystrix主要是使用它的超时、降级、熔断等功能。不少评委提出了质疑,因为他们认为Hystrix信号量模式是不支持超时的。
Talk is cheap,Show me your code
信号量模式
从实验中我们可以看出,Hystrix的信号量模式确实是支持超时的,但是结论就真的这么简单吗?
对于线程池实现超时比较容易理解,future.get(timeout)就可以了,但是对于信号量该如何实现以及理解呢。
我们接下来继续实验。
从输出的日志顺序可以看出来,明明是run执行完成之后,才在main方法中接收到的TimeoutException。 也就是说 Hystrix任务会在 main线程中会一直执行Hystrix任务,直到任务执行结束,如果发现执行时间超过了Hytrix设置的超时时间,main线程才会接收到异常。并不是在超时时间内结果Hystrix任务,释放资源。
那么如果实现了fallback又会是什么样子的呢?
从日志中可以看出,fallback其实任务在到达超时时间(也就是配置的150ms)时,由另外的线程去执行的fallback内容。但是main线程也只能在Hystrix run方法执行完成之后才能获取到fallback中的返回值。
上面的执行路径大概如下:
线程池模式
从日志可以看出,对于线程池模式,在到达timeout时候,会有HystrixTimer线程会把运行任务的Hystrix线程设置为中断,然后使用 HystrixTimer线程去之心fallback。
执行路径大概如下:
那么如果对于运行run方法的代码逻辑如果不支持中断又会怎么样呢?
虽然运行run方法的线程被设置了中断标志,但是因为run方法本身不支持中断逻辑,所以该线程会一直运行直到任务执行完毕。
为什么很多人认为信号量不支持超时
我想很多人认为信号量不支持超时,应该是来自于Hystrix的官网上诱导,官方上明确提到信号量模式是不支持。
看了一下官网上最后一次更新都是两年前了,应该是没有及时更新wiki才会导致很多人出现这个误解。
在早期的时候Hystrix信号量确实是不支持超时时间的,当时仅仅线程池支持,设置超时时间的参数为withExecutionIsolationThreadTimeoutInMilliseconds,但是在1.4.0之后的版本,信号量也就支持了超时时间,此时参数统一修改成了withExecutionIsolationThreadTimeoutInMilliseconds。
总结
从上述分析我们可以得出Hystrix的超时机制:
Hystrix在任务启动时会启动另外一个线程HystrixTime去监测任务。如果在TimeOut时间内,任务未完成,对于线程池模式,会把执行任务的线程设置为中断;对于信号量模式,Hystrix不会对执行任务的线程做任何操作。然后再使用HystrixTime线程去执行fallback逻辑。
所以大家一定要明白: 对于信号量超时模式,如果发生超时,Hystrix任务并不会结束,任务结束还是得依赖于run方法执行完毕。
对于线程池超时模式,如果发生超时,Hystrix任务可以结束,不依赖于run方法执行情况,但是run方法可能还会在执行,这依赖与run方法中的代码逻辑。
由此带来哪些问题呢?
-
在run方法中加入监控,看到的执行时间可能远大于timeout
-
配置的线程数能支持的最小QPS不是简单的”线程数 / timeout“。
-
对于信号量模式,整体串形链路的的最大时间,不是简单的Hystrix1的timeout + Hystrix2的timeout + ... + HystrixN的timeout。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- TCP 协议可靠性是如何保证:滑动窗口,超时重发,序列号确认应答信号
- 树莓派基础-模拟信号和数字信号的区别
- xenomai内核解析之信号signal(二)---xenomai信号处理机制
- 没信号也可救你命:苹果新专利让iPhone无信号也可充当紧急信标
- redigo设置超时时间
- 深入理解 JDBC 的超时
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
大学程序设计课程与竞赛训练教材
吴永辉、王建德 / 机械工业出版社 / 2013-6 / 69.00
本书每章为一个主题,实验内容安排紧扣大学算法和数学的教学,用程序设计竞赛中的算法和数学试题作为实验试题,将算法和数学的教学与程序设计竞赛的解题训练结合在一起;在思维方式和解题策略的训练方面,以问题驱动和启发式引导为主要方式,培养读者通过编程解决问题的能力。 本书特点: 书中给出的234道试题全部精选自ACM国际大学生程序设计竞赛的世界总决赛以及各大洲赛区现场赛和网络预赛、大学程序设计竞......一起来看看 《大学程序设计课程与竞赛训练教材》 这本书的介绍吧!