您的位置:首页 > 其它

HytrixCommand实践总结

2018-01-11 09:51 176 查看

一. 使用HystrixCommand编码方式

//构造setter
HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey(group);
HystrixThreadPoolKey threadPoolKey = HystrixThreadPoolKey.Factory.asKey(group);
HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey(service);
HystrixCommandProperties.Setter commandPropertiesDefaults = HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds(100)
.withCircuitBreakerForceOpen(true);

HystrixThreadPoolProperties.Setter threadPoolPropertiesDefaults = HystrixThreadPoolProperties.Setter()
.withCoreSize(10)
.withQueueSizeRejectionThreshold(10);

HytrixCommand.Setter setter = HytrixCommand.Setter.withGroupKey(groupKey)
.andCommandKey(commandKey)
.andThreadPoolKey(threadPoolKey);
.andCommandPropertiesDefaults(commandPropertiesDefaults)
.andThreadPoolPropertiesDefaults(threadPoolPropertiesDefaults);

//构造command
HystrixCommand<String> command = new HystrixCommand<String>(setter) {
protected String run() throws Exception {
logger.info("##################### in hystrix thread");
Thread.sleep(time);
if(isException)
throw new RuntimeException("exception in run");
return service+ ":return";
}
@Override
protected String getFallback() {
logger.info("##################### in request thread");
return service+":fallback";
}
};

1 HystrixCommandKey
Hystrix使用单例模式存储HystrixCommand,熔断机制就是根据单实例上的调用情况统计实现的,所以每个HystrixCommand要有自己的名字,用于区分,同时用于依赖调用的隔离。HystrixCommandKey就是用于定义这个名字,如果没有定义这个名字,Hystrix会使用其类名作为其名字,可以使用HystrixCommandKey.Factory.asKey(String name)方法定义一个名称。

2 HystrixThreadPoolKey
HystrixThreadPoolKey是HystrixCommand所在的线程池,如果该参数不设置则使用HystrixCommandGroupKey作为HystrixThreadPoolKey,这种情况下同一个HystrixCommandGroupKey下的依赖调用共用同一个线程池内,如果不想共用同一个线程池,则需要设置该参数。可以使用HystrixThreadPoolKey.Factory.asKey(String name)方法设置。

3 HystrixCommandGroupKey
Hystrix需要对HystrixCommand进行分组,便于统计、管理,所以需要一个分组名称,HystrixCommandGroupKey就是用于定义分组名称,可以使用HystrixCommandGroupKey.Factory.asKey(String name)方法定义一个分组名。每个HystrixCommand必须要配置一个分组名,一个是用于分组,还有如果没有配置HystrixThreadPoolKey,这个分组名将会用于线程池名。

4 HystrixThreadPoolProperties
从名称上可以看出这是线程池的属性配置,可以通过它设置核心线程数大小、最大线程数、任务队列大小等,当然它也又一些默认的配置参数。

5 HystrixCommandProperties
这个就是HystrixCommand的属性配置,它可以设置熔断器是否可用、熔断器熔断的错误百分比、依赖调用超时时间等,它有一些默认的配置参数,如熔断器熔断的错误百分比默认值是50%、依赖调用超时时间默认值是1000毫秒。

二. 使用@HystrixCommand方式

这里只讲注解的使用方式以及比较重要的部分,如果需要了解全部查看:https://github.com/Netflix/Hystrix/wiki/How-To-Use

2.1 Hystrix command

2.1.1 同步执行

2.1.2 异步执行

2.1.3 反应执行()

2.1.4 三种模式使用区别

同步执行:当执行到注解方法时,程序会顺序执行。

异步执行:当执行到注解方法时,会并发异步执行,返回一个Future对象,后面使用.get()方法来阻塞拿到结果。如果有多个方法时,执行时间就是其中最长的一个服务的执行时间。

反应执行:当执行到注解方法时,返回一个观察者。支持EAGER和LAZY模式。和同步异步执行的区别是,当对多个方法之间的返回结果不需要做合并而是希望当多个方法返回时触发一些事件时比较适合使用该模式。

反应执行没太明白,如果需要了解可以先参考下这个https://mcxiaoke.gitbooks.io/rxdocs/content/Intro.html

2.2 Fallback

注意点:fallback应该和注解方法在同一类下

fallback的返回值和参数列表应该和注解方法一致,如果需要异常,则在末尾添加Throwable参数,对访问修饰符无要求

fallback方法上可以继续添加fallback

command和fallback只支持以下几种组合:sync command, sync fallback

async command, sync fallback

async command, async fallback

2.3 Error Propagation

当遇到BadRequestException时不会进入fallback,而是直接抛出异常

2.4 Configuration

参数
作用
备注
groupKey表示所属的group,一个group共用线程池默认值:getClass().getSimpleName();
commandKey默认值:当前执行方法名
execution.isolation.strategy隔离策略,有THREAD和SEMAPHORE默认使用THREAD模式,以下几种可以使用SEMAPHORE模式:只想控制并发度

外部的方法已经做了线程隔离

调用的是本地方法或者可靠度非常高、耗时特别小的方法(如medis)

execution.isolation.thread.timeoutInMilliseconds 超时时间默认值:1000在THREAD模式下,达到超时时间,可以中断在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时设置标准:有retry,99meantime+avg meantime没有retry,99.5meantime
execution.timeout.enabled是否打开超时
execution.isolation.thread.interruptOnTimeout是否打开超时线程中断THREAD模式有效
execution.isolation.semaphore.maxConcurrentRequests信号量最大并发度SEMAPHORE模式有效,默认值:10
fallback.isolation.semaphore.maxConcurrentRequestsfallback最大并发度默认值:10
circuitBreaker.requestVolumeThreshold熔断触发的最小个数/10s默认值:20
circuitBreaker.sleepWindowInMilliseconds熔断多少秒后去尝试请求默认值:5000
circuitBreaker.errorThresholdPercentage失败率达到多少百分比后熔断默认值:50主要根据依赖重要性进行调整
circuitBreaker.forceClosed是否强制关闭熔断如果是强依赖,应该设置为true
coreSize线程池coreSize默认值:10设置标准:qps*99meantime+breathing room
maxQueueSize请求等待队列默认值:-1如果使用正数,队列将从SynchronizeQueue改为LinkedBlockingQueue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Hystrix Command 详解