2017-09-14 6 views
1

springbootサービスで回路ブレーカの概念を実装するためにhystrixを使用しています。私は失敗のthreshhold数の場合、外部サービス呼び出しを絞ることが必要である方法で使用HystrixCommand注釈は次のとおりです。さて、myHystrixMethodが常駐するサービスは、異なるクライアントによって呼び出され動的hystrixコマンドを作成する方法threadPoolKey

@HystrixCommand(commandKey = "myCommandKey", 
      groupKey = "myGroupKey", 
      threadPoolKey = "myThreadPoolKey") 
    public String myHystrixMethod(String someParam) { ....} 

。サービスを呼び出すクライアントのタイプに基づいて、特定のクライアントに指定されたバックエンドサービスを呼び出すロジックがあります。

私がしたいのは、それ自身のhystrixスレッドプールに特定のクライアントによって呼び出されたすべてのスレッド(要求)を登録することです。つまり、クライアントAからの要求は、クライアントAのhystrixスレッドプールに登録され、クライアントBのhystrixスレッドプールのクライアントBのみに登録されます。これにより、クライアントBの要求がクライアントAの障害によって抑制されなくなります。

このため、すべてのクライアントに対して個別のサービスメソッド(上に示したもの)を作成し、それに応じてhystrixスレッドプールに名前を付けます。しかし、このアプローチでは、新しいクライアントがあるときはいつでも、ソースコードを修正してサービスメソッドを追加する必要があります。

@HystrixCommandアノテーション内のオプションを、この場合のクライアントIDであるパラメータに基づいて動的に作成する方法はありますか?

+0

私は可能ではないと思います。見てみましょう。 https://github.com/Netflix/Hystrix/issues/350 – pvpkiran

+0

hystrixのように見えません。 hystriixのような他の回路ブレーカソリューションには、動的にそのようなプロパティを動的に作成するオプションがありますか? – Hary

+0

他の図書館があります。しかし、私はあなたがこの機能をそこに見つけるとは思わない。見て、私たちに知らせてください。 :) – pvpkiran

答えて

0

私はHystrixライブラリではそれを行う方法がわかりませんが、Resilience4Jライブラリをベースにした解決策がここにあります。

CircuitBreakerRegistry Beanをクライアントにデフォルト設定で登録することができます。

@Bean 
public CircuitBreakerRegistry circuitBreakerRegistry() { 
    CircuitBreakerConfig config = CircuitBreakerConfig.custom() 
      .failureRateThreshold(35) 
      .ringBufferSizeInClosedState(1000) 
      .ringBufferSizeInHalfOpenState(100) 
      .waitDurationInOpenState(Duration.ofMinutes(1)) 
      .build(); 
    return CircuitBreakerRegistry.of(config); 
} 

このレジストリをサービスに挿入するだけで、保護された方法でCBを入手できます。

CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("ClientA"); 

この操作は、既に登録されている回路ブレーカを見つけたり、必要に応じて、レジストリのデフォルトの設定を使用して新しいものを作成します。

これでCircuitBreakerのいずれかの方法(isCallPermitted()またはexecuteRunnable()など)を使用できます。

詳細については、User Guideを参照してください。

関連する問題