このアプリケーションでは、いくつかの外部サービスを呼び出すため、Hystrixを使用します。呼び出す外部サービスごとに、特定のサイズの1つのスレッドプールを構成する必要があります。
S1、S2、S3と呼ばれる3つの外部サービスがあると仮定しましょう。さらに、C1からC10と呼ばれるHystrixCommand
を拡張する10個のクラスがあります。
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)));
1つのコマンド(C1)のコンストラクター内で、S1のスレッドプールサイズを15に指定します。ThreadPools
は、final
static
属性S1
が次のように定義されるカスタムクラスです。
S1 = HystrixThreadPoolKey.Factory.asKey("S1");
ここで実際の質問は、(1)スレッドプールのコアサイズ(S1の場合は15)が中央のスレッドプール定義ではなくHystrixCommand
内で指定される理由です(これはHystrixの概念ではないようです)。
C2
(上記のスニペットと同じように見えます)のコンストラクター内で、15以外の引数を使用して withCoreSize を呼び出すとします。(2)どちらを使用しますか?
(3)サービスS1、S2、S3の3つのスレッドプールを1つのクラスで定義し、コマンドクラスからそれらを参照する方法はありますか?
Hystrix 使い方 ガイドにはそれに関連する情報が含まれていないようです。誰かがこの質問に答える時間があれば素晴らしいでしょう。
次のような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の違いについてのわかりやすい説明は次のとおりです。