Как восстановить клиента с предупреждением "Нет обработчика, ожидающего сообщения"?

При средней и высокой нагрузке (тестовая и производственная) при использовании клиента Redis Vert.x я получаю следующее предупреждение после нескольких сотен запросов.

2019-11-22 11:30:02.320 [vert.x-eventloop-thread-1] WARN io.vertx.redis.client.impl.RedisClient - No handler waiting for message: [null, 400992, <data from redis>]

В результате обработчик, предоставленный для вызова Redis (см. Ниже), не вызывается, и время ожидания входящего запроса истекает.

Handler<AsyncResult<String>> handler = res -> {
    // success handler
};

redis.get(key, res -> {
    handler.handle(res);
});

Реальная проблема заключается в том, что как только появляется предупреждение "Нет обработчика...", клиент Redis становится бесполезным, поскольку все дальнейшие вызовы Redis, сделанные через клиент, завершаются сбоем с тем же предупреждением, что приводит к тому, что обработчик не вызывается. У меня есть обработчик исключений, установленный на клиенте для попытки повторного подключения, но я не вижу попыток повторного подключения.

Как избавиться от этой проблемы? Любые обходные пути для облегчения серьезности также будут отличными.

Я использую vertx-core и vertx-redis-client 3.8.1 .

1 ответ

Решение

В предстоящем выпуске 4.0 эта проблема была решена, и скоро должен появиться выпуск, как скоро, я не могу точно сказать.

Проблема в том, что мы не можем легко перенести обратно из основной ветки в ветку 3.8, потому что на клиенте произошел серьезный рефакторинг, а кодовые базы сильно различаются.

Новый код использует пул соединений и был протестирован на одновременный доступ (и именно здесь возникает проблема, которую вы видите). Под нагрузкой запросы маршрутизируются по всем циклам событий, и очередь, которая поддерживает состояние между запросами в полете (запросы, отправленные в redis) и ожидающими обработчиками, рассинхронизируются в очень особых условиях.

Поэтому я сначала попробую посмотреть, можете ли вы уже начать переводить свой код на 4.0, вы можете попробовать 4.0.0-milestone3 версия, но чтобы все было в порядке, просто попробуйте последнюю master в котором решено больше проблем в этой области.

Другие вопросы по тегам