在我们的应用程序中,我们使用Hystrix,因为我们调用了几个外部服务。我们希望为我们调用的每个外部服务配置一个具有特定大小的线程池。
假设有三个外部服务,称为S1,S2,S3。此外,我们有10个类扩展HystrixCommand
,称为C1到C10。
C1和C2调用S1并应使用相同的线程池,包含15个线程。在C1的构造函数中,我们对super
进行以下调用:
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("S1"))
.andThreadPoolKey(ThreadPools.S1)
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(15))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(timeout)));
在一个命令(C1)的构造函数中,我们将S1的线程池大小指定为15. ThreadPools
是一个自定义类,final
static
属性{{1} }由
S1
现在的实际问题是,(1)为什么线程池核心大小(对于S1为15)是在S1 = HystrixThreadPoolKey.Factory.asKey("S1");
而不是中心线程池定义中指定的(其中)似乎不是Hystrix的概念。
假设在HystrixCommand
的构造函数内部(看起来与上面的代码片段相同),我们用15以外的参数调用withCoreSize。(2)将使用哪一个?
(3)有没有办法在一个类中为服务S1,S2和S3定义三个线程池,并从命令类中引用它们?
Hystrix How to Use指南似乎不包含与此相关的信息。如果有人有时间回答这个问题,那就太好了。
答案 0 :(得分:4)
您可以定义名为config.properties
的属性文件,如下所示:
hystrix.threadpool.S1.coreSize=15
hystrix.threadpool.S1.maximumSize=15
hystrix.threadpool.S1.maxQueueSize=15
hystrix.threadpool.S1.queueSizeRejectionThreshold=300
hystrix.threadpool.S1.allowMaximumSizeToDivergeFromCoreSize=true
hystrix.threadpool.S1.keepAliveTimeMinutes=1
hystrix.threadpool.S2.coreSize=20
hystrix.threadpool.S2.maximumSize=20
hystrix.threadpool.S2.maxQueueSize=20
hystrix.threadpool.S2.queueSizeRejectionThreshold=300
hystrix.threadpool.S2.allowMaximumSizeToDivergeFromCoreSize=true
hystrix.threadpool.S2.keepAliveTimeMinutes=1
...
这是一个很好的解释,关于coreSize,maximumSize& maxQueueSize: