当前位置: 首页 > 知识库问答 >
问题:

Webflux WebClient重试和Spring Cloud Currict Breaker Resilience4J重试模式走进一个酒吧

柳越
2023-03-14

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

然后第三方应用程序(不是我们的)开始变得脆弱,有时会在我们的要求下失败。我们必须实现某种重试逻辑。在实现重试逻辑(如WebClient reties)之后,业务流现在工作正常。我们主要是直接从框架中提取逻辑。例如,在最近的SpringOne上,来自@Simon-Baslé、取消、重试和超时的一次演讲给出了许多工作示例

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

另一方面,最近有越来越多的应用程序走向断路器模式。由Resilience4J支持的Spring Cloud Currict Breaker项目是一个流行的实现,它使用Resilience4J用于诸如断路器、舱壁以及重试等模式。

谢谢。

共有1个答案

郭和硕
2023-03-14

我们(Resilience4j团队)已经为断路器、重试和超时实现了定制的SpringReactor操作符。内部重试和超时使用Spring Reactor中的操作符,但Resilience4j在其之上添加了功能:

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

请参见https://Resilience4j.readme.io/docs/examples-1和https://Resilience4j.readme.io/docs/geting-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 Batch 2.2.0里面退出,现在它是Spring Retry的一部分. 为了让这个进程更稳定,更小的失败性。有时它帮助自动重试一个失败的操作以防止它可能在后续的尝试成功。本质上,这种处理会导致误差。例如,远程调用网络服务或RMI服务失败是由于在短暂的数据更新后,网络故障或冻结异常aDeadLockLoserException.例如重试这种自动化操作,Spri

  • 编辑 继续重试直到promise解决的模式(具有延迟和最大重试次数) #1的代码。不断重试,直到promise解决为止(语言社区有任何改进吗?) 使用 #2的代码继续重试,直到以可重用的方式产生结果(条件是会发生变化的)。

  • 有时一些业务逻辑的发生你每次都想重试它。最经典的例子就是远程调用,为了这个目的Spring Batch提供了一个Aop拦截器用来封装一个方法调用RetryOperations 。RetryOperationsInterceptor依据RetryPolicy 提供的RepeatTemplate 执行拦截方法和重试失败。 下面是一个示例使用Spring AOP命名空间的声明式迭代重复一个服务调用的一个

  • 问题内容: 编辑 继续重试直到承诺解决的模式(带有delay和maxRetries)。 在结果满足条件之前一直重试的模式(带有delay和maxRetries)。 具有无限重试次数(提供延迟)的高效内存动态模式。 #1的代码。 继续重试,直到承诺解决为止(该语言是否有任何改进社区?) 采用 #2的代码会 继续重试,直到条件以可重用的方式满足条件为止(条件会有所不同)。 问题答案: 有点不同… 异步

  • 以下是用于实现重试逻辑的类 TestRetry类: RetryListener类: 样本测试: 当我执行上述测试时,以下是输出firsttest被执行并通过第二次测试依赖于firsttest并被执行,其失败-重试3次并再次失败第三次测试跳过,因为它依赖于第二次测试。 产量达到预期。 问:因为测试是依赖的,如果其中一个测试失败,我想先执行整个类,有办法吗? 示例:如果secondtest失败,我想再

  • 使用以下定义的Avro模式和测试代码,在考虑Avro模式演变以及如何存储Avro数据的第一个版本并随后使用模式的第二个版本检索时,我有几个问题。在我的示例中,表示第一个版本,表示第二个版本,其中我们添加了属性。 < li >有没有办法在Java中将Avro模式和二进制编码数据存储为字节数组?我们希望将Avro对象存储到DynamoDB中,并且希望将Avro数据存储为一个blob,模式存储在它旁边(