私は Resilience4J を初めて使用し、Spring ブートと統合しようとしています。
私のアプリケーションには、いくつかのリモート システム コールがあります。すべてのリモート コールに対して同じサーキット ブレーカー構成が必要です。
resilience4Jオペレーターでリモート呼び出しを装飾するJava構成と機能スタイルを使用しています。現在、すべてのリモート システム コールに対して 1 つのサーキット ブレーカーと 1 つの再試行 Bean を定義しています。
@Bean
public CircuitBreakerConfig circuitBreakerConfig() {
return CircuitBreakerConfig.custom().slidingWindowType(SlidingWindowType.COUNT_BASED).slidingWindowSize(6)
.failureRateThreshold(50).waitDurationInOpenState(Duration.ofSeconds(10))
.permittedNumberOfCallsInHalfOpenState(3).recordExceptions(HttpClientErrorException.class, HttpServerErrorException.class,TimeoutException.class,SdkClientException.class,AmazonServiceException.class,SQLException.class,JDBCException.class, DataAccessException.class).build();
}
@Bean
public CircuitBreaker circuitBreaker(CircuitBreakerConfig circuitBreakerConfig) {
return CircuitBreaker.of("circuit-config", circuitBreakerConfig);
}
@Bean
public RetryConfig retryConfig() {
return RetryConfig.custom().maxAttempts(3).waitDuration(Duration.ofMillis(1000))
.retryExceptions(HttpClientErrorException.class, HttpServerErrorException.class,TimeoutException.class,SdkClientException.class,AmazonServiceException.class,SQLException.class,JDBCException.class, DataAccessException.class).build();
}
@Bean
public Retry retry() {
return Retry.of("retry-config", retryConfig());
}
Decorators.ofRunnable(systemA::callA)
.withCircuitBreaker(circuitBreaker)
.withRetry(retry)
.decorate()
.run();
Decorators.ofRunnable(systemB::callB)
.withCircuitBreaker(circuitBreaker)
.withRetry(retry)
.decorate()
.run();
しかし、この方法では、サーキット ブレーカー (およびその内部リング バッファー) がシステム A とシステム B の間で共有されていることがわかりました。これにより、1 つのリモート システムの障害が、別のリモート システムの障害しきい値に影響を与えています。
リモート システムごとに障害しきい値が維持されるように、リモート システムごとに個別のサーキット ブレーカーが必要です。ただし、回路ビーカーの構成は、リモート システム全体で同じままです。
これを達成するためのベストプラクティスは何ですか?