8.hystrix的fallback降级机制



1、创建command
2、执行command
3、request cache
4、短路器,如果打开了,fallback降级机制


1、fallback降级机制


(1)hystrix调用各种接口,或者访问外部依赖,mysql,redis,zookeeper,kafka,等等,如果出现了任何异常的情况
比如说报错了,访问mysql报错,redis报错,zookeeper报错,kafka报错,error


(2)对每个外部依赖,无论是服务接口,中间件,资源隔离,对外部依赖只能用一定量的资源去访问,线程池/信号量,如果资源池已满,reject


(3)访问外部依赖的时候,访问时间过长,可能就会导致超时,报一个TimeoutException异常,timeout


上述三种情况,都是我们说的异常情况,对外部依赖的东西访问的时候出现了异常,发送异常事件到短路器中去进行统计


(4)如果短路器发现异常事件的占比达到了一定的比例,直接开启短路,circuit breaker


上述四种情况,都会去调用fallback降级机制




fallback,降级机制,你之前都是必须去调用外部的依赖接口,或者从mysql中去查询数据的,但是为了避免说可能外部依赖会有故障


比如,你可以再内存中维护一个ehcache,作为一个纯内存的基于LRU自动清理的缓存,数据也可以放入缓存内


如果说外部依赖有异常,fallback这里,直接尝试从ehcache中获取数据


比如说,本来你是从mysql,redis,或者其他任何地方去获取数据的,获取调用其他服务的接口的,结果人家故障了,人家挂了,fallback,可以返回一个默认值


两种最经典的降级机制:纯内存数据,默认值


run()抛出异常,超时,线程池或信号量满了,或短路了,都会调用fallback机制


给大家举个例子,比如说我们现在有个商品数据,brandId,品牌,一般来说,假设,正常的逻辑,拿到了一个商品数据以后,用brandId再调用一次请求,到其他的服务去获取品牌的最新名称


假如说,那个品牌服务挂掉了,那么我们可以尝试本地内存中,会保留一份时间比较过期的一份品牌数据,有些品牌没有,有些品牌的名称过期了,Nike++,Nike


调用品牌服务失败了,fallback降级就从本地内存中获取一份过期的数据,先凑合着用着






2、fallback.isolation.semaphore.maxConcurrentRequests


这个参数设置了HystrixCommand.getFallback()最大允许的并发请求数量,默认值是10,也是通过semaphore信号量的机制去限流


如果超出了这个最大值,那么直接被reject


HystrixCommandProperties.Setter()
   .withFallbackIsolationSemaphoreMaxConcurrentRequests(int value)
   
   
   
   
   
   HystrixCommand实现getFallback方法


public class GetBrandNameCommand extends HystrixCommand {

private Long brandId;

public GetBrandNameCommand(Long brandId) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("BrandInfoService"))
.andCommandKey(HystrixCommandKey.Factory.asKey("GetBrandNameCommand"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("GetBrandInfoPool"))
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
.withCoreSize(15)//设置线程池大小
.withQueueSizeRejectionThreshold(10))//设置等待队列大小
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withFallbackIsolationSemaphoreMaxConcurrentRequests(15))//设置最大允许的降级并发请求数量,默认值是10,也是通过semaphore信号量的机制去限流
);  
this.brandId = brandId;
}

@Override
protected String run() throws Exception {
// 调用一个品牌服务的接口
// 如果调用失败了,报错了,那么就会去调用fallback降级机制
throw new Exception();
}

@Override
protected String getFallback() {
System.out.println("从本地缓存获取过期的品牌数据,brandId=" + brandId);  
return BrandCache.getBrandName(brandId);
}


}



HystrixObservableCommand,是实现resumeWithFallback方法




   
   
   
   


你可能感兴趣的:(hystrix)