This version is still in development and is not considered stable yet. For the latest stable version, please use Spring-Cloud-CircuitBreaker 3.2.0!

Bulkhead pattern supporting

If resilience4j-bulkhead is on the classpath, Spring Cloud CircuitBreaker will wrap all methods with a Resilience4j Bulkhead. You can disable the Resilience4j Bulkhead by setting spring.cloud.circuitbreaker.bulkhead.resilience4j.enabled to false.

Spring Cloud CircuitBreaker Resilience4j provides two implementation of bulkhead pattern:

  • a SemaphoreBulkhead which uses Semaphores

  • a FixedThreadPoolBulkhead which uses a bounded queue and a fixed thread pool.

By default, Spring Cloud CircuitBreaker Resilience4j uses FixedThreadPoolBulkhead. To modify the default behavior to use SemaphoreBulkhead set the property spring.cloud.circuitbreaker.resilience4j.enableSemaphoreDefaultBulkhead to true.

For more information on implementation of Bulkhead patterns see the Resilience4j Bulkhead.

The Customizer<Resilience4jBulkheadProvider> can be used to provide a default Bulkhead and ThreadPoolBulkhead configuration.

@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()
);
}

Reactive Bulkhead Pattern Supporting

If you are using reactive programming with Spring Cloud CircuitBreaker, you can leverage the ReactiveResilience4jBulkheadProvider to support the Bulkhead pattern in reactive pipelines. This provider decorates Mono and Flux instances to ensure bulkhead constraints are applied during reactive operations.

Spring Cloud CircuitBreaker Resilience4j reactive support only uses the SemaphoreBulkhead. If the property spring.cloud.circuitbreaker.resilience4j.enableSemaphoreDefaultBulkhead is set to false, a warning will be logged, and the ReactiveResilience4jBulkheadProvider will still use the SemaphoreBulkhead.

Configuring Reactive Bulkhead

The ReactiveResilience4jBulkheadProvider can be customized using a Customizer bean, as shown below:

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

You can also add individual bulkhead configurations for specific use cases:

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

For more details, see the Resilience4j Reactive Bulkhead Examples.