深刻浅出Hystrix-隔离策略

Hystrix隔离模式目前有两种方式:信号量模式和线程池模式。redis

但信号量并不支持超时,当被调服务发生问题时,有少部分用户会长时间没法获得响应。并发

另外,使用线程池模式没法传递Header,我估计是因为线程切换,参数传递过程当中被去掉了。异步

1、信号量和线程池

 

是否有线程切换spa

是否支持异步线程

是否支持超时中间件

是否支持熔断blog

开销大小接口

是否支持限流队列

信号量ci

线程池

 

2、信号量隔离

信号量的使用示意图以下图所示,当n个并发请求去调用一个目标服务接口时,都要获取一个信号量才能真正去调用目标服务接口,但信号量有限,默认是10个,能够使用maxConcurrentRequests参数配置,若是并发请求数多于信号量个数,就有线程须要进入队列排队,但排队队列也有上限,默认是 5,若是排队队列也满,则一定有请求线程会走fallback流程,从而达到限流和防止雪崩的目的。

信号量模式从始至终都只有请求线程自身,是同步调用模式,不支持超时调用,不支持直接熔断,因为没有线程的切换,开销很是小。

 

3、线程池隔离

线程池的使用示意图以下图所示,当n个请求线程并发对某个接口请求调用时,会先从hystrix管理的线程池里面得到一个线程,而后将参数传递给这个线程去执行真正调用。线程池的大小有限,默认是10个线程,能够使用maxConcurrentRequests参数配置,若是并发请求数多于线程池线程个数,就有线程须要进入队列排队,但排队队列也有上限,默认是 5,若是排队队列也满,则一定有请求线程会走fallback流程。

线程池模式能够支持异步调用,支持超时调用,支持直接熔断,存在线程切换,开销大。

 

优势: 
    一、 使用线程池隔离能够彻底隔离第三方应用,请求线程能够快速放回。

    二、 请求线程能够继续接受新的请求,若是出现问题线程池隔离是独立的不会影响其余应用。 
    三、 当失败的应用再次变得可用时,线程池将清理并可当即恢复,而不须要一个长时间的恢复。 
    四、 独立的线程池提升了并发性。

    注意:尽管线程池隔离是由一个单独的线程提供,客户端代码(异常方法里面的请求)应该也 有超时机制,不能让响应的线程无限期等待,应该适时去中断它,阻止 Hystrix 线程池的饱和。

缺点: 
    线程池隔离的主要缺点是它们增长计算开销(CPU)。每一个命令的执行涉及到排队、调度和上 下文切换都是在一个单独的线程上运行的。

 

4、 应用场景 

线程池隔离: 
    一、 第三方应用或者接口 
    二、 并发量大

信号量隔离:      一、 内部应用或者中间件(redis)      二、 并发需求不大

相关文章
相关标签/搜索