这里写目录标题
- Hytrix容错机制
- 熔断
- 资源隔离
- 线程池隔离
- 信号量隔离
- 服务降级
- 请求缓存
- 请求合并
- Hystrix流程图
Hytrix容错机制
熔断
- 在一个统计时间窗口(HYST rixCommandProperties.metricsRollingStatisticalWindowInMilliseconds())内,处理的请求数达到设置的最小阈值(HYST)rixCommandProperties.circuitBreakerRequestVolumeThreshold()),错误百分比超过设置的最大阈值(HYST)rixCommandProperties.circuitBreakerThreshold() ) )此时断路器分闸,断路器状态由合闸切换为分闸。
- 当断路器断开时,它将直接融合所有请求(快速失败)并经过回退逻辑。
- 经过一个休眠窗口时间(HYST rixCommandProperties.circuitBreakerSleepWindowInMilliseconds()),Hystrix会释放一个进行后续服务并将断路器开关切换到半开(half OPEN)。如果请求失败,断路器将熔断开关切换到OPEN状态,继续熔断所有请求,直到下一个休眠时间窗口到来;如果请求成功,断路器将切换到 CLOSED 状态,此时允许所有请求通过,直到发生一步,断路器开关才会切换到 OPEN 状态。
资源隔离
资源隔离主要指对线程的隔离。Hystrix提供了两种线程隔离方式:线程池和信号量。
线程池隔离
通过将发送请求线程与执行请求的线程分离,可有效防止发生级联故障。当线程池或请求队列饱和时,Hystrix将拒绝服务,使得请求线程可以快速失败,从而避免依赖问题扩散。
信号量隔离
使用线程池时,发送请求的线程和执行依赖服务的线程不是同一个,而使用信号量时,发送请求的线程和执行依赖服务的线程是同一个,都是发起请求的线程。
服务降级
Fallback相当于是降级操作。 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值。 fallback方法的返回值一般是设置的默认值或者来自缓存。告知后面的请求服务不可用了,不要再来了。
请求缓存
请求缓存:比如一个请求过来请求我userId=1的数据,你后面的请求也过来请求同样的数据,这时我不会继续走原来的那条请求链路了,而是把第一次请求缓存过了,把第一次的请求结果返回给后面的请求。
请求合并
请求合并:我依赖于某一个服务,我要调用N次,比如说查数据库的时候,我发了N条请求发了N条SQL然后拿到一堆结果,这时候我们可以把多个请求合并成一个请求,发送一个查询多条数据的SQL的请求,这样我们只需查询一次数据库,提升了效率。
Hystrix流程图
1、每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中;
2、使用调用HystrixCommand的execute来执行一个业务方法调用。Hystrix除了提供了execute方法,另外还提供了3种方法(queue、observer、toObserver);
3、判断是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。【Hystrix支持请求缓存,但需要用户自定义启动】
4、判断熔断器是否打开,如果打开跳到步骤8;
5、判断线程池/队列/信号量是否已满,已满则跳到步骤8;
6、调用HystrixCommand的run方法。运行依赖逻辑,如果执行失败或者超时,跳到步骤8;如果执行成功则直接返回结果;
7、计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态
8、走Fallback备用逻辑。
以下四种情况将触发getFallback调用:
8.1 熔断器开启拦截调用
8.2 线程池/队列/信号量是否跑满
8.3 run()方法调用超时
8.4 run()方法抛出非HystrixBadRequestException异常
https://www.jianshu.com/p/3e8148d65786
流程图:https://blog.csdn.net/qq_43437044/article/details/128466503
https://www.jianshu.com/p/3e8148d65786