Автоматический выключатель vertx больше никогда не закрывается
У меня проблема с моим CircleBreaker. Если я спам запросы к моему сервису, канал 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);
мои опции CircleBreaker:
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'
Я вижу, что никакие запросы не заканчиваются правильно.
мой код 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
как водитель