Hystrix常用属性配置总结如下,详解介绍查看:https://github.com/Netflix/Hystrix/wiki/Configuration#intro
几个关键参数下面会进行详细介绍。
线程池大小
估算原则:线程池大小尽可能小,以便当发生阻塞时最小化对系统的影响。
估算公式:线程池大小N=峰值QPS * 99%请求处理延时 + 冗余线程M;
隔离策略
策略1:THREAD
特点:命令由专门的线程池执行,线程池的大小决定了并发请求的上限;
优点:超时或阻塞时能够资源隔离,不影响业务线程;
缺点:线程池有额外的调度和线程上线文切换开销;
适用场景:延时高、网络不稳定(有阻塞)的场景;
策略2:SEMAPHORE
特点:命令由当前调用线程执行,Semaphore的大小决定了并发请求的上限;
适用场景:延时低、高并发、无阻塞的场景;
总结
当请求的服务网络开销比较大的时候,或者是请求比较耗时的时候,我们最好是使用线程隔离策略,这样的话,可以保证大量的容器(tomcat)线程可用,不会由于服务原因,一直处于阻塞或等待状态,快速失败返回。而当我们请求缓存这些服务的时候,我们可以使用信号量隔离策略,因为这类服务的返回通常会非常的快,不会占用容器线程太长时间,而且也减少了线程切换的一些开销,提高了缓存服务的效率。
代码示例
HystrixCommandProperties设置
public HystrixCommandProperties.Setter getCommandPropertiesSetter() {
HystrixCommandProperties.Setter cs = HystrixCommandProperties.Setter()
.withCircuitBreakerErrorThresholdPercentage(30).withCircuitBreakerRequestVolumeThreshold(20)
.withCircuitBreakerSleepWindowInMilliseconds(5);
return cs;
}
HystrixThreadPoolProperties设置
public HystrixThreadPoolProperties.Setter getThreadPoolPropertiesSetter() {
HystrixThreadPoolProperties.Setter ths = HystrixThreadPoolProperties.Setter().withCoreSize(4).withMaximumSize(4)
.withQueueSizeRejectionThreshold(10);
return ths;
}
HystrixCommand设置
public HystrixCommand.Setter getCommandSetter() {
HystrixCommandGroupKey gk = HystrixCommandGroupKey.Factory.asKey("group1");
HystrixCommandKey ck = HystrixCommandKey.Factory.asKey("cmdKey1");
return HystrixCommand.Setter.withGroupKey(gk).andCommandKey(ck)
.andCommandPropertiesDefaults(getCommandPropertiesSetter())
.andThreadPoolPropertiesDefaults(getThreadPoolPropertiesSetter());
}