Hystrix面接-Hystrix隔離戦略の詳細制御



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 pool
    command 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.maxConcerentRequests
    SEMAPHORE隔離戦略を使用した時にアクセスできる最大合併量を設定し、これを上回る最大合併量を設定し、直接rejectを要求します。
    このマージン量の設定は、スレッドサイズの設定と似ているはずですが、信号量によっては性能が良くなり、Hystrixフレーム自体のオーバーヘッドが小さくなります。
    デフォルトの値は10です。設定が大きすぎると、遅延が発生し、瞬時にtomcat自体のスレッドリソースがいっぱいになる可能性があります。
    HystrixCommandProperties.Setter().withExecutionIsolationSemaphoreMaxConcurrentRequests(int value);
     
    転載元:https://github.com/doocs/advanced-java/blob/master/docs/high-availability/hystrix-execution-isolation.md