我的circuitBreaker有问题。如果我正确地向我的服务发送请求电路OPEN
,并解决超时错误。在设置超时后,电路进入HALF_OPEN
状态 - 应有的一切。
但是从这里开始,电路再也不会关闭。每个请求都会导致错误并立即再次打开电路。
我使用cb通过vertx eventBus在我的服务之间进行通信,如下所示:
return this.circuitBreaker.rxExecuteCommandWithFallback(
future -> this.vertx.eventBus().rxSend("myEvent", myBody)
.subscribe(
data -> future.complete(data.body().toString()),
err -> future.fail(err.getMessage())
), Throwable::getMessage);
我的circuitBreaker选项:
return new CircuitBreakerOptions()
.setMaxFailures(10)
.setTimeout(2000L)
.setResetTimeout(5000L)
.setMaxRetries(2)
.setFallbackOnFailure(true);
我的配置错了吗?我可能使用rxified API错误吗?
修改
如果我在docker容器中运行我的代码我只是得到错误:
io.vertx.core.impl.NoStackTraceThrowable: operation timeout
如果我在本地启动应用程序,我会发现PG / SQL实际上抛出了sorry, too many clients
异常。这肯定会解释为什么电路仍然打开,但由于我已经关闭了我的客户成功和错误,我真的不明白为什么会发生这种情况。
-
似乎我当前在请求后关闭连接的方式是错误的。当我通过SELECT * FROM pg_stat_activity where state = 'idle'
检查我的数据库连接时,我可以看到没有请求实际上正确终止。
我执行db查询的java代码如下所示:
final AsyncSQLClient client = PostgreSQLClient.createShared(vertx, getConnectionData(), "mypool");
return client
.rxGetConnection()
.flatMap(conn -> conn.rxQuery(sql))
.map(res -> {
client.rxClose();
return res;
})
.doOnError(err -> {
client.rxClose();
});
我使用io.vertx:vertx-mysql-postgresql-client:3.4.1
作为驱动程序