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.