我有一个Facade,它针对某种类型的请求调用3种不同的服务,并最终将响应编排回客户端之前。在此,必须强制所有3个服务正常运行并按预期运行。即使其中之一已关闭,也无法满足客户请求。 我正在寻找断路器来解决此问题。即使其中一项服务中断,断路器也应以错误代码响应。我正在检查resilence4j断路器,它不适合我的问题。
https://resilience4j.readme.io/docs/circuitbreaker
还有其他可用的开源软件吗?
答案 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笔交易。