Hystrix面接-Hystrix隔離戦略の詳細制御
4586 ワード
Hystrix面接-Hystrix隔離戦略の詳細制御
Hystrixは資源分離を実現し、二つの戦略があります。
execution.isolation.strate gy
HystrixCommand.run()のリソース分離戦略を指定しました。
THREAD
or SEMAPHORE
は、信号量に基づくスレッド池に基づくものである。// to use thread isolation
HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD)
// to use semaphore isolation
HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
スレッドプール機構は、各commandがスレッド内で動作し、制限ストリームはスレッドプールのサイズによって制御される。信号量メカニズムは、commandが起動スレッドで動作し、信号量の容量によって制限されます。どのようにオンラインのプログラムと信号量の間で選択しますか?
デフォルトのポリシーはスレッド池です。
スレッドプールの最大の利点は、ネットワークアクセス要求に対して、タイムアウトがあれば、スレッドがブロックされないようにすることです。
信号量を使用するシーンは、通常、大規模な同時量のシーンに対して、各サービス・インスタンスは毎秒数百分のものである。
QPS
では、スレッドを使用すると、スレッドは一般的に多すぎず、高合併を維持できない可能性があります。サポートするには、スレッドリソースが大量に消費される可能性があります。一般的に使用される信号量は、任意のネットワークアクセス要求に関わらず、純メモリベースのいくつかのトラフィック論理サービスに一般的である。command key&command group
私達はスレッドプールを使って隔離していますが、どうやってサービスに依存していますか?
各commandは、自分の名前command keyを設定することができます。同時に自分のグループcommand groupを設定することができます。
private static final Setter cachedSetter = Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"));
public CommandHelloWorld(String name) {
super(cachedSetter);
this.name = name;
}
command groupは非常に重要な概念であり、デフォルトでは、command groupによってスレッド池を定義しています。また、command groupによっていくつかの監視と警報情報を集約しています。同じcommand groupの中の要求はいずれも同じスレッド池に入る。command thread pool
ThreadPoolKeyはHystrixThreadPoolを代表して、統一監視、統計、キャッシュを行います。デフォルトのThreadPoolKeyはcommand groupの名前です。各commandはそのThreadPool Keyに対応するThreadPoolと結びつけられます。
直接にcommand groupを使いたくないなら、ThreadPoolの名前を手動で設定することもできます。
private static final Setter cachedSetter = Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool"));
public CommandHelloWorld(String name) {
super(cachedSetter);
this.name = name;
}
command key&command group&command thread poolcommand key ,一つの種類のcommandを表しています。一般的に、一階の依存サービスの一つのインターフェースを表しています。
command group ,ある底辺の依存サービスを代表しています。これは合理的で、一つの依存サービスが複数のインターフェースを暴露する可能性があります。各インターフェースは一つのcommand keyです。command groupは論理的にまとめられたcommand keyの呼び出し、統計情報、成功回数、タイムアウト回数、失敗回数など、あるサービス全体のいくつかのアクセス状況を見ることができます。一般的に、一つのサービスエリアによってスレッドが分かれていますが、command keyはデフォルトでは同じスレッドプールに属しています。
例えば、あなたは一つのサービスを粒径として、このサービスの毎秒のあらゆるインターフェースを合わせた全体を見積もってみます。
QPS
100ぐらいで、このサービスを起動して、現在このサービスは10のサービスインスタンスを展開しています。各サービスの実例において、このcommand groupはこのサービスに対応しています。スレッドプールをあげます。量は大体10ぐらいでいいです。サービス全体に対するアクセスはQPSは毎秒100ぐらいです。しかし、command groupは一つのサービスに対応していると言えば、このサービスが暴露されたいくつかのインターフェースは、アクセス量が非常に違っています。このサービスの中に、複数のインターフェースに対応するcommand keyが含まれています。細かい粒度の資源分離をしたいです。つまり、同じサービスに対して異なるインターフェースを使います。
command key -> command group
command key -> thread pool key
論理的には、複数のcommand keyは一つのcommand groupに属しています。統計をする時、一緒に統計します。各command keyは自分のスレッドプールを持っています。各インターフェースは自分のスレッドプールを持っています。ホワイトポイントというのは、あなたのcommand keyが自分のスレッドを使って、自分のthread pool keyを定義すればOKです。
coreSize
スレッドのサイズを設定します。デフォルトは10です。一般的には、このデフォルトの10スレッドサイズで十分です。
HystrixThreadPoolProperties.Setter().withCoreSize(int value);
queueSize Rejection Threholdスレッドの中の10スレッドが作業中で、他のスレッドが空いていないという場合は、再度要求がありますので、先に列に積み込みます。列がいっぱいになったら、また来てください。直接reject、要求を拒否して、fallbackダウンのロジックを実行して、速やかに戻ります。
コントロールはqueueがいっぱいになったらrejectのthrererereesholdです。maxQueueueue Sizeは熱的に修正できないので、このパラメータを提供して熱的に修正できます。キューの最大サイズを制御します。
HystrixThreadPoolProperties.Setter().withQueueSizeRejectionThreshold(int value);
execution.isolation.semaphore.maxConcerentRequestsSEMAPHORE隔離戦略を使用した時にアクセスできる最大合併量を設定し、これを上回る最大合併量を設定し、直接rejectを要求します。
このマージン量の設定は、スレッドサイズの設定と似ているはずですが、信号量によっては性能が良くなり、Hystrixフレーム自体のオーバーヘッドが小さくなります。
デフォルトの値は10です。設定が大きすぎると、遅延が発生し、瞬時にtomcat自体のスレッドリソースがいっぱいになる可能性があります。
HystrixCommandProperties.Setter().withExecutionIsolationSemaphoreMaxConcurrentRequests(int value);
転載元:https://github.com/doocs/advanced-java/blob/master/docs/high-availability/hystrix-execution-isolation.md