协调器的断路器

时间:2019-10-31 20:08:03

标签: circuit-breaker resilience4j

我有一个Facade,它针对某种类型的请求调用3种不同的服务,并最终将响应编排回客户端之前。在此,必须强制所有3个服务正常运行并按预期运行。即使其中之一已关闭,也无法满足客户请求。   我正在寻找断路器来解决此问题。即使其中一项服务中断,断路器也应以错误代码响应。我正在检查resilence4j断路器,它不适合我的问题。

https://resilience4j.readme.io/docs/circuitbreaker

还有其他可用的开源软件吗?

2 个答案:

答案 0 :(得分:0)

为什么它不适合您的问题? 您可以使用CircuitBreaker保护每项服务。一旦其中一个CircuitBreakers打开,您就可以短路并将错误响应直接返回给客户端。

答案 1 :(得分:0)

CircuitBreaker适用于受保护的功能,如下所示–

线程<-> CircuitBreaker <-> Protected_Function

因此Protected_Function可以调用1个或多个微服务,大多数情况下,我们使用1个Protected_Function进行1个外部微服务调用,因为我们可以根据特定微服务的配置文件或行为来调整弹性。但是由于您的要求不同,所以我们可以在1 Protected_Function下进行3个通话。

因此,根据您的上述解释,Façade正在调用3个微服务(假定为串联)。您可以做的就是通过“受保护的功能”或在“受保护的功能”之内称自己为Façade或所有三项服务–

@CircuitBreaker(name = "OVERALL_PROTECTION")
public Your_Response  Protected_Function  (Your_Request) {
        Call_To_Service_1;
        Call_To_Service_2;
        Call_To_Service_3;
        return Orchestrate_Your_Response;
}

您还可以在YAML属性文件中为OVERALL_PROTECTION添加弹性,如下所示(我已经使用了基于计数的滑动窗口)–

resilience4j.circuitbreaker:
  backends:
    OVERALL_PROTECTION:
      registerHealthIndicator: true
      slidingWindowSize: 100                     # start rate calc after 100 calls
      minimumNumberOfCalls: 100                  # minimum calls before the CircuitBreaker can calculate the error rate.
      permittedNumberOfCallsInHalfOpenState: 10  # number of permitted calls when the CircuitBreaker is half open
      waitDurationInOpenState: 10s               # time that the CircuitBreaker should wait before transitioning from open to half-open
      failureRateThreshold: 50                   # failure rate threshold in percentage
      slowCallRateThreshold: 100                 # consider all transactions under interceptor for slow call rate
      slowCallDurationThreshold: 2s              # if a call is taking more than 2s then increase the error rate
      recordExceptions:                          # increment error rate if following exception occurs
        - org.springframework.web.client.HttpServerErrorException
        - java.io.IOException
        - org.springframework.web.client.ResourceAccessException

如果您愿意,也可以使用基于时间的slidingWindow而不是基于计数的方法,其余的我已经在配置中的每个参数前面提到了#Comment以进行自我解释。

resilience4j.retry:
  instances:
    OVERALL_PROTECTION:
      maxRetryAttempts: 5
      waitDuration: 100
      retryExceptions:
        - org.springframework.web.client.HttpServerErrorException
        - java.io.IOException
        - org.springframework.web.client.ResourceAccessException

如果发生retryExceptions下的异常,上述配置将重试5次。

resilience4j.ratelimiter:
  instances:
    OVERALL_PROTECTION:
       timeoutDuration: 100ms                  #The default wait time a thread waits for a permission
       limitRefreshPeriod: 1000                #The period of a limit refresh. After each period the rate limiter sets its permissions count back to the limitForPeriod value
       limitForPeriod: 25                      #The number of permissions available during one limit refresh period

以上配置将在1秒内最多允许25笔交易。