【问题标题】:CircuitBreaker immediate fallback断路器立即回退
【发布时间】:2021-10-31 19:12:35
【问题描述】:

我关注 https://resilience4j.readme.io/docs/getting-started-3 获取 Resilience4J 文档。

我有一个问题,当主后端不可用时,我的断路器立即连接到回退(在第一次调用时)。

@Bean
public CircuitBreakerConfig circuitBreakerConfig() {
    return CircuitBreakerConfig.custom()
            .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
            .slidingWindowSize(5)
            .minimumNumberOfCalls(5)
            .failureRateThreshold(4)
            .build();
}

我也尝试将配置移动到 application.yml,但仍然是相同的行为。

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;

@CircuitBreaker(name = "backendA", fallbackMethod = "fallbackA")
public String backendA() {
  return restTemplate.getForObject("http://localhost:9999/backendA", String.class);
}

public String fallbackA(Exception e) {
    return restTemplate.getForObject("http://localhost:8080/partner", String.class);
}

有人可以帮忙吗?

//更新

更多详情如下。 如上面的代码所示,我的应用正在调用 /backendA,位于断路器后面。预计根据配置,如果 backendA 不可用,则应该失败 5 次,然后第 6 次调用将回退到 /partner API。或者换句话说,电路应该在 5 次调用后打开。

这就是我测试的方式。

我启动了应用程序。 backendA 和 fallbackA 都可用。几个电话后,我杀死了后端A。对 backendA 的下一次调用将回退到 /partner,而我预计对 backendA 的下一个 5 次调用将失败而没有后备。我的预期正确吗?

【问题讨论】:

  • 您能否说明您的测试方式、您期望发生什么以及实际发生了什么?
  • @TimMoore 用您要求的详细信息更新了问题

标签: java circuit-breaker resilience4j


【解决方案1】:

经过一些研究,我开始知道间歇性故障的回退是一种预期的行为,尽管我无法在任何地方找到它的记录。因此,即使电路已关闭,如果方法抛出匹配的异常,也会调用回退。

注意: 如果您对立即回退不满意,请使用 RETRY 配置对其进行包装。

【讨论】:

    【解决方案2】:

    @CircuitBreaker- 如果它的状态是 open,您应该会立即收到回退并且它不再调用您想要的服务的结果。

    如果您希望在您关闭被调用的后端服务并且想要 5 次调用直到您得到回退之前,您需要使用 @Retry,如果调用失败,那么它将尝试再次调用您的服务。

    如果你使用多个符号,你可以阅读更多关于订单here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      相关资源
      最近更新 更多