circuit-breaker - 在检查函数中注册失败尝试似乎被计算为双倍
问题描述
我正在探索resilience4j,并且希望既能够记录检查函数中断路器的故障,又能够返回有意义的结果。但是当我这样做时,失败似乎被计算为两倍。
我使用的是 0.13.1 版:
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-circuitbreaker</artifactId>
<version>0.13.1</version>
</dependency>
检查以下测试,我们有一个 10 的封闭环形缓冲区,这表明在 CircuitBreaker 可以跳闸之前应该评估 10 个调用。除非在onError
检查函数中使用断路器方法记录故障,否则会出现这种情况:
@Test
public void testRecordFailure() {
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.ringBufferSizeInClosedState(10)
.build();
CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);
CircuitBreaker breaker1 = registry.circuitBreaker("breaker-1");
CircuitBreaker breaker2 = registry.circuitBreaker("breaker-2");
CheckedFunction0<String> supplier2 = CircuitBreaker.decorateCheckedSupplier(breaker2, () -> {
throw new RuntimeException();
});
CircuitBreaker breaker3 = registry.circuitBreaker("breaker-3");
CheckedFunction0<String> supplier3 = CircuitBreaker.decorateCheckedSupplier(breaker3, () -> {
breaker3.onError(0, new RuntimeException());
return "meaningful-result";
});
for (int i = 0; i < 4; i++) {
breaker1.onError(0, new RuntimeException());
Try.of(supplier2);
Try.of(supplier3);
}
assertEquals(CircuitBreaker.State.CLOSED, breaker1.getState()); // Success
assertEquals(CircuitBreaker.State.CLOSED, breaker2.getState()); // Success
assertEquals(CircuitBreaker.State.CLOSED, breaker3.getState()); // Success
breaker1.onError(0, new RuntimeException());
Try.of(supplier2);
Try.of(supplier3);
assertEquals(CircuitBreaker.State.CLOSED, breaker1.getState()); // Success
assertEquals(CircuitBreaker.State.CLOSED, breaker2.getState()); // Success
assertEquals(CircuitBreaker.State.CLOSED, breaker3.getState()); // Failure - circuit is now OPEN - why?
}
我无法找到这种行为的解释,或者是否存在一种方法来记录检查功能内的断路器故障。任何人都可以对此有所了解吗?
干杯!
解决方案
您不必调用 onError。这是由高阶函数完成的。
推荐阅读
- node.js - 这些命令在 buildkite 中是什么意思?
- javascript - 如何在一页中输入多个优化的图像?(netlify-cms + gatsby-image + gatsby)
- dart - Stream 何时开始向侦听器发布值?
- php - PHP/MYSQL 替换字典数组中键的文本
- docker - 为什么 docker run 命令无法识别指定的环境变量?
- c++ - 继承的方法不会改变变量值
- node.js - 在 Node 中,为什么“需要”赋值有时需要大括号?
- c# - 有没有办法在 Visual Studio 中将 Outlook 项目保存为 pdf?
- libgdx - Libgdx GestureDirector pan 在处理多个手指时表现异常
- angular - 如何从 Azure 门户应用程序设置添加自定义声明