Webflux WebClient retry and Spring Cloud Circuit Breaker Resilience4J Retry pattern走进酒吧
Webflux WebClient retry and Spring Cloud Circuit Breaker Resilience4J Retry pattern walk into a bar
想问一个关于两种技术的问题。
我们首先从一个必须调用其他第三方 rest API 的应用程序开始,因此,我们在 SpringBoot Webflux 项目中使用了 Webflux WebClient。到目前为止一切顺利,我们有一段时间成功的应用程序。
然后第三方应用程序(不是我们的)开始变得不稳定,有时会在我们的请求上失败。我们必须实施某种重试逻辑。在执行重试逻辑后,例如 WebClient reties,业务流程现在可以正常工作。
我们主要是直接从框架中拿逻辑。例如,@simon-baslé 在最近 SpringOne 上的一次关于取消、重试和超时的演讲给出了许多工作示例。
.retryWhen(backoff(5, Duration.ofMillis(10).maxbackOff(Duration.ofSeconds(1)).jitter(0.4)).timeout(Duration.ofSeconds(5)
另一方面,最近,越来越多的应用程序转向断路器模式。 Spring 由 Resilience4J 支持的 Cloud Circuit Breaker 项目是一个流行的实现,它使用 Resilience4J 来实现断路器、隔板,当然还有重试等模式。
因此,我有一个问题,using/combining 在重试方面是否有好处?
将两者放在一起有什么好处吗?有什么缺点吗?
或者两者只选一个就够了,请问是哪一个?为什么?
谢谢
我们(Resilience4j 团队)已经为 CircuitBreaker、Retry 和 Timeout 实现了自定义 Spring Reactor 运算符。内部 Retry 和 Timeout 使用来自 Spring Reactor 的运算符,但 Resilience4j 在其之上添加了功能:
- 通过配置文件对 Retry、Timeout 和 CircuitBreaker 进行外部配置
- Spring Cloud Config支持动态调整配置
- 指标、指标、指标 ;)
请看https://resilience4j.readme.io/docs/examples-1 and https://resilience4j.readme.io/docs/getting-started-3
您甚至可以使用注释来使其更简单:
@CircuitBreaker(name = BACKEND)
@RateLimiter(name = BACKEND)
@Retry(name = BACKEND)
@TimeLimiter(name = BACKEND, fallbackMethod = "fallback")
public Mono<String> method(String param1) {
return ...
}
private Mono<String> fallback(String param1, TimeoutException ex) {
return ...;
}
请注意,我们正在提供我们自己的 Spring 启动器。我不是在谈论 Spring Cloud CircuitBreaker 项目。
想问一个关于两种技术的问题。
我们首先从一个必须调用其他第三方 rest API 的应用程序开始,因此,我们在 SpringBoot Webflux 项目中使用了 Webflux WebClient。到目前为止一切顺利,我们有一段时间成功的应用程序。
然后第三方应用程序(不是我们的)开始变得不稳定,有时会在我们的请求上失败。我们必须实施某种重试逻辑。在执行重试逻辑后,例如 WebClient reties,业务流程现在可以正常工作。 我们主要是直接从框架中拿逻辑。例如,@simon-baslé 在最近 SpringOne 上的一次关于取消、重试和超时的演讲给出了许多工作示例。
.retryWhen(backoff(5, Duration.ofMillis(10).maxbackOff(Duration.ofSeconds(1)).jitter(0.4)).timeout(Duration.ofSeconds(5)
另一方面,最近,越来越多的应用程序转向断路器模式。 Spring 由 Resilience4J 支持的 Cloud Circuit Breaker 项目是一个流行的实现,它使用 Resilience4J 来实现断路器、隔板,当然还有重试等模式。
因此,我有一个问题,using/combining 在重试方面是否有好处?
将两者放在一起有什么好处吗?有什么缺点吗?
或者两者只选一个就够了,请问是哪一个?为什么?
谢谢
我们(Resilience4j 团队)已经为 CircuitBreaker、Retry 和 Timeout 实现了自定义 Spring Reactor 运算符。内部 Retry 和 Timeout 使用来自 Spring Reactor 的运算符,但 Resilience4j 在其之上添加了功能:
- 通过配置文件对 Retry、Timeout 和 CircuitBreaker 进行外部配置
- Spring Cloud Config支持动态调整配置
- 指标、指标、指标 ;)
请看https://resilience4j.readme.io/docs/examples-1 and https://resilience4j.readme.io/docs/getting-started-3
您甚至可以使用注释来使其更简单:
@CircuitBreaker(name = BACKEND)
@RateLimiter(name = BACKEND)
@Retry(name = BACKEND)
@TimeLimiter(name = BACKEND, fallbackMethod = "fallback")
public Mono<String> method(String param1) {
return ...
}
private Mono<String> fallback(String param1, TimeoutException ex) {
return ...;
}
请注意,我们正在提供我们自己的 Spring 启动器。我不是在谈论 Spring Cloud CircuitBreaker 项目。