1

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

4

0 回答 0