Webflux WebClient 重试和 Spring Cloud 断路器 Resilience4J 重试模式走进一个吧

Pat*_*Pat 1 circuit-breaker spring-webflux resilience4j spring-webclient

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

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

然后第三方应用程序(不是我们的)开始变得不稳定,有时会无法满足我们的请求。我们必须实现某种重试逻辑。执行重试逻辑后,如WebClient重试,业务流程正常。我们主要是直接从框架中提取逻辑。例如,最近在 SpringOne 上@simon-baslé、Cancel、Retry 和 Timeouts 的演讲给出了许多工作示例。

.retryWhen(backoff(5, Duration.ofMillis(10).maxbackOff(Duration.ofSeconds(1)).jitter(0.4)).timeout(Duration.ofSeconds(5)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢

小智 5

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

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

请参阅 https://resilience4j.readme.io/docs/examples-1https://resilience4j.readme.io/docs/getting-started-3

您甚至可以使用 Annotations 使其更简单:

@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 ...;
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们正在提供我们自己的 Spring Boot 启动器。我不是在谈论 Spring Cloud CircuitBreaker 项目。