Hystrix隔离模式目前有两种方式:信号量模式和线程池模式。redis
但信号量并不支持超时,当被调服务发生问题时,有少部分用户会长时间没法获得响应。并发
另外,使用线程池模式没法传递Header,我估计是因为线程切换,参数传递过程当中被去掉了。异步
是否有线程切换spa |
是否支持异步线程 |
是否支持超时中间件 |
是否支持熔断blog |
开销大小接口 |
是否支持限流队列 |
|
信号量ci |
否 |
否 |
否 |
是 |
小 |
是 |
线程池 |
是 |
是 |
是 |
是 |
大 |
是 |
信号量的使用示意图以下图所示,当n个并发请求去调用一个目标服务接口时,都要获取一个信号量才能真正去调用目标服务接口,但信号量有限,默认是10个,能够使用maxConcurrentRequests参数配置,若是并发请求数多于信号量个数,就有线程须要进入队列排队,但排队队列也有上限,默认是 5,若是排队队列也满,则一定有请求线程会走fallback流程,从而达到限流和防止雪崩的目的。
信号量模式从始至终都只有请求线程自身,是同步调用模式,不支持超时调用,不支持直接熔断,因为没有线程的切换,开销很是小。
线程池的使用示意图以下图所示,当n个请求线程并发对某个接口请求调用时,会先从hystrix管理的线程池里面得到一个线程,而后将参数传递给这个线程去执行真正调用。线程池的大小有限,默认是10个线程,能够使用maxConcurrentRequests参数配置,若是并发请求数多于线程池线程个数,就有线程须要进入队列排队,但排队队列也有上限,默认是 5,若是排队队列也满,则一定有请求线程会走fallback流程。
线程池模式能够支持异步调用,支持超时调用,支持直接熔断,存在线程切换,开销大。
优势:
一、 使用线程池隔离能够彻底隔离第三方应用,请求线程能够快速放回。
二、 请求线程能够继续接受新的请求,若是出现问题线程池隔离是独立的不会影响其余应用。
三、 当失败的应用再次变得可用时,线程池将清理并可当即恢复,而不须要一个长时间的恢复。
四、 独立的线程池提升了并发性。
注意:尽管线程池隔离是由一个单独的线程提供,客户端代码(异常方法里面的请求)应该也 有超时机制,不能让响应的线程无限期等待,应该适时去中断它,阻止 Hystrix 线程池的饱和。
缺点:
线程池隔离的主要缺点是它们增长计算开销(CPU)。每一个命令的执行涉及到排队、调度和上 下文切换都是在一个单独的线程上运行的。
线程池隔离:
一、 第三方应用或者接口
二、 并发量大
信号量隔离: 一、 内部应用或者中间件(redis) 二、 并发需求不大