我的断路器有问题。如果我向我的服务发送垃圾邮件请求,电路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);
我的断路器选项:
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
用作司机