バルクヘッドパターン対応

resilience4j-bulkhead がクラスパス上にある場合、Spring Cloud CircuitBreaker はすべてのメソッドを Resilience4j Bulkhead でラップします。spring.cloud.circuitbreaker.bulkhead.resilience4j.enabled を false に設定することで、Resilience4j Bulkhead を無効にできます。

Spring Cloud CircuitBreaker Resilience4j は、バルクヘッドパターンの 2 つの実装を提供します。

  • セマフォを使用する SemaphoreBulkhead 

  • 制限付きキューと固定スレッドプールを使用する FixedThreadPoolBulkhead

デフォルトでは、Spring Cloud CircuitBreaker Resilience4j は FixedThreadPoolBulkhead を使用します。SemaphoreBulkhead を使用するようにデフォルトの動作を変更するには、プロパティ spring.cloud.circuitbreaker.resilience4j.enableSemaphoreDefaultBulkhead を true に設定します。

バルクヘッドパターンの実装の詳細については、Resilience4j バルクヘッド (英語) を参照してください。

Customizer<Resilience4jBulkheadProvider> を使用して、デフォルトの Bulkhead および ThreadPoolBulkhead 構成を提供できます。

@Bean
public Customizer<Resilience4jBulkheadProvider> defaultBulkheadCustomizer() {
    return provider -> provider.configureDefault(id -> new Resilience4jBulkheadConfigurationBuilder()
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(4).build())
        .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).maxThreadPoolSize(1).build())
        .build()
);
}

リアクティブ隔壁パターンのサポート

Spring Cloud と CircuitBreaker でリアクティブプログラミングを使用している場合、ReactiveResilience4jBulkheadProvider を利用してリアクティブパイプラインでバルクヘッドパターンをサポートできます。このプロバイダーは、Mono と Flux インスタンスをデコレートすることで、リアクティブ操作中にバルクヘッド制約が適用されるようにします。

Spring Cloud CircuitBreaker Resilience4j のリアクティブサポートは SemaphoreBulkhead のみを使用します。spring.cloud.circuitbreaker.resilience4j.enableSemaphoreDefaultBulkhead プロパティが false に設定されている場合は警告がログに記録され、ReactiveResilience4jBulkheadProvider は引き続き SemaphoreBulkhead を使用します。

リアクティブバルクヘッドの構成

ReactiveResilience4jBulkheadProvider は、以下に示すように、Customizer Bean を使用してカスタマイズできます。

@Bean
public Customizer<ReactiveResilience4jBulkheadProvider> reactiveBulkheadCustomizer() {
    return provider -> provider.configureDefault(id -> new Resilience4jBulkheadConfigurationBuilder()
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(4).build())
        .build());
}

特定のユースケースに合わせて個別のバルクヘッド構成を追加することもできます。

@Bean
public Customizer<ReactiveResilience4jBulkheadProvider> reactiveSpecificBulkheadCustomizer() {
    return provider -> provider.configure(builder -> {
        builder.bulkheadConfig(BulkheadConfig.custom()
            .maxConcurrentCalls(2)
            .build());
    }, "serviceBulkhead");
}

詳細については、Resilience4j リアクティブバルクヘッドの例 (英語) を参照してください。