3

私は 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 つのリモート システムの障害が、別のリモート システムの障害しきい値に影響を与えています。

リモート システムごとに障害しきい値が維持されるように、リモート システムごとに個別のサーキット ブレーカーが必要です。ただし、回路ビーカーの構成は、リモート システム全体で同じままです。

これを達成するためのベストプラクティスは何ですか?

4

1 に答える 1