Add support for reactive Resilience4jBulkheadProvider to provide bulkhead support for reactive operations (Mono and Flux).

This commit is contained in:
Yavor Chamov
2025-01-08 00:22:57 +02:00
parent d0b471aa72
commit 079f231efe
3 changed files with 40 additions and 0 deletions

View File

@@ -28,3 +28,41 @@ public Customizer<Resilience4jBulkheadProvider> defaultBulkheadCustomizer() {
}
----
== 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:
[source,java]
----
@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:
[source,java]
----
@Bean
public Customizer<ReactiveResilience4jBulkheadProvider> reactiveSpecificBulkheadCustomizer() {
return provider -> provider.configure(builder -> {
builder.bulkheadConfig(BulkheadConfig.custom()
.maxConcurrentCalls(2)
.build());
}, "serviceBulkhead");
}
----
For more details, see the https://resilience4j.readme.io/docs/examples-1#decorate-mono-or-flux-with-a-bulkhead[Resilience4j Reactive Bulkhead Examples].

View File

@@ -73,6 +73,7 @@ public class ReactiveResilience4JCircuitBreaker implements ReactiveCircuitBreake
this(id, groupName, config, circuitBreakerRegistry, timeLimiterRegistry, circuitBreakerCustomizer, false);
}
@Deprecated
public ReactiveResilience4JCircuitBreaker(String id, String groupName,
Resilience4JConfigBuilder.Resilience4JCircuitBreakerConfiguration config,
CircuitBreakerRegistry circuitBreakerRegistry, TimeLimiterRegistry timeLimiterRegistry,

View File

@@ -59,6 +59,7 @@ public class ReactiveResilience4JCircuitBreakerFactory extends
this(circuitBreakerRegistry, timeLimiterRegistry, null, null);
}
@Deprecated
public ReactiveResilience4JCircuitBreakerFactory(CircuitBreakerRegistry circuitBreakerRegistry,
TimeLimiterRegistry timeLimiterRegistry,
Resilience4JConfigurationProperties resilience4JConfigurationProperties) {