Webflux WebClient重试和Spring Cloud Circuit Breaker Resilience4



我想问一个关于两种技术的问题。

我们首先从一个必须调用其他第三方rest API的应用程序开始,因此,我们在SpringBoot Webflux项目中使用了Webflux WebClient。到目前为止还不错,我们有一个成功的应用程序已经有一段时间了。

然后第三方应用程序(而不是我们的(开始变得不稳定,有时会根据我们的要求失败。我们必须实现某种重试逻辑。在实现了重试逻辑(如WebClient重定时(之后,业务流现在可以正常工作。我们主要是直接从框架中获取逻辑。例如,@simon-baslé、Cancel、Retry和Timeouts在最近的SpringOne上的一次演讲给出了许多工作示例。

.retryWhen(backoff(5, Duration.ofMillis(10).maxbackOff(Duration.ofSeconds(1)).jitter(0.4)).timeout(Duration.ofSeconds(5)

另一方面,最近有越来越多的应用程序走向断路器模式。由Resilience4J支持的Spring Cloud Circuit Breaker项目是一个流行的实现,它使用Resilience 4J来实现断路器、隔板,当然还有重试等模式。

因此,我有一个问题,在重试方面使用/组合两者是否有好处?

把两者放在一起有什么好处吗?有什么缺点吗?

或者两个中只有一个就足够了,在这种情况下,请选择哪一个?为什么?

谢谢

我们(Resilience4j团队(已经为CircuitBreaker、Retry和Timeout实现了自定义的Spring Reactor操作符。内部Retry和Timeout使用Spring Reactor中的运算符,但Resilience4j在其上面添加了功能:

  1. 通过配置文件对重试、超时和断路器进行外部配置
  2. Spring Cloud Config支持动态调整配置
  3. 度量,度量,度量;(

请参阅https://resilience4j.readme.io/docs/examples-1和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 Boot启动器。我不是在说春云断路器项目。

最新更新