Hystrix 高级应用【面试】

参考:
http://www.uml.org.cn/wfw/201906063.asp?artid=22057
https://www.cnblogs.com/jing99/p/11625306.html (有详细的使用配置)
Hystrix配置简单说明
hystrix线程池隔离的原理与验证
面试
为什么需要 Hystrix
在微服务中,高并发的访问下,服务之前的依赖稳定性与否对系统影响非常大,但是依赖有很多不可控的问题:
连接缓慢,连接超时,资源错误等等,当依赖阻塞时,大多数服务器的线程池就出现阻塞,影响线上的稳定性。

1、Hystrix 可以做什么

hystrix可以实现隔离,限流,熔断,降级这些常用保护功能。
hystrix的隔离分为线程池隔离和信号量隔离,隔离是其他功能实现(限流,熔断,降级)的基础。

1、隔离

1.1 信号量隔离

  1. 是通过信号量实现的,信号量说白了就是计数器,计数器达到设定的阈值,直接就做异常处理。<br /> hystrix信号量隔离是限制tomcatweb容器的线程数,达到设置阈值后,多余的请求直接被拒绝,<br /> 因为实际上是通过隔离了部分容器资源,也是一种隔离方式。

1.2 线程池隔离

信号量隔离本身起到的只是限流的作用,它的保护能力有限,如果下游服务有问题,长时间不返回结果。
信号量隔离对单个请求是起不到任何作用的,只能限制这样的请求太多了就拒绝,不让整个服务挂。
于是有个线程池隔离,这种方式是引入额外线程的方式,对原来web容器线程做管控,
如果一个线程超时未返回,则直接熔断。
相比于信号量隔离,需要引入额外的线程池管理和线程上下文切换的开销,成本较高。

2、限流

信号量隔离就是hystrix的限流功能。
ratelimiter的令牌桶算法和漏桶算法,都是直接对请求量来计数。
只是令牌桶算法可以将前面一段时间没有用掉的请求量允许余额拿过继续用。而漏桶算法一段时间就允许这么多,前面没用掉的也不能用了。

3、熔断原理

隔离不但可以做保护,还可以做统计,成功了多少,失败了多少,既然有统计数据就可以进一步处理,
如果一定时间
执行频繁失败,说明现在有问题,执行完了再发现失败,太浪费资源,干脆就不让工作线程执行了,
过段时间重试。
就是断路器模式,也是熔断的原理。

4、降级原理

其实就是基于熔断,熔断后返回的设定的结果就是降级。

2、hystrix工作模式

Hystrix 高级应用【面试】 - 图1

3、如何代码使用

1、在远程调用调用的api上配置

@FeignClient(name = “provider”,/fallback = RemoteApiFallBack.class/ fallbackFactory = RemoteApiFallbackFactory.class,configuration = FeignLogConfiguration.class)

2、在 fallbackFactory 里面去配置自定义,对于异常接口调用返回的信息。

3、Hystrix 可以yml里面具体配置

默认调用超时一秒,会触发熔断,需要开启,默认没有开启。

4、隔离模式

默认是:线程隔离模式
自己理解:
每个请求(http或者rpc请求)可以分为俩部分,一部分是接收请求,一部分是调用下游接口依赖(调用rpc)。
如果是信号量隔离模式,则这俩部分是同一个线程去执行。
如果是线程池隔离模式,则是多个线程去执行,如果同时调用多个下游接口,每个请求rpc接口都是基于同一个线程池的一个新的线程

1、线程池隔离模式:

使用一个线程池来储存当前请求,线程池对请求处理,设置任务返回处理超时时间,堆积的请求先入线程池队列。
这种方式需要为每个依赖服务申请线程池,有一定的资源消耗,
好处
1、可以应对突发流量,(流量洪峰来时,处理不完可将请求放在线程队列里面慢慢处理)
默认的队列上限是5,如果队列排满必须请求线程走 fallback(降级)
2、 提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒), 熔断器默认错误率阈值为50%,超过将自动运行。
特点 有一定的资源消耗,

2、信号量隔离模式:

使用一个原子计数器(或者信号量)记录当前有多少个线程在允许,请求先判断计数器的数值,若超过设置的最大线程 个数则丢弃该类型的请求请求计数器 -1,若不超过则执行计数器+1。这种方式严格控制线程立即返回模式,
缺点是无法应对突发流量(流量洪峰来时,处理不完的请求直接返回,不继续请求),
特点 请求线程和调用依赖服务的线程是同一个线程,效率高
Hystrix 高级应用【面试】 - 图2

5、如何判断超时

在运行对应的command时,hystrix会注册到一个timer 到一个定时线程池中,当超时后会启用一个hystrix线程来终止执行。线程池的管理用的时 ThreadPoolExecuor,当线程池和阻塞队列都满后会抛出拒绝异常。