Брокер Kafka на некоторое время выводит список пустых узлов *
В целях тестирования интеграции я создаю очень простое одноузловое развертывание Kafka:
- 1x зоопарк
- 1x Кафка
- 1x клиент Kafka (например, AdminClient, создание тем)
(Все чисто развернуто в свежих контейнерах Docker.)
Я вижу периодические сбои при подключении от клиента к Kafka, но всякий раз, когда я пытаюсь подключиться снова, он просто подключается нормально. Я включил ведение журнала отладки на клиенте Kafka, и вот что я вижу при первом подключении:
Клиент подключается к своему настроенному серверу начальной загрузки просто отлично:
[main] DEBUG o.a.k.c.a.i.AdminMetadataManager - [AdminClient clientId=adminclient-1] Setting bootstrap cluster metadata Cluster(id = null, nodes = [kafka:9092 (id: -1 rack: null)], partitions = [], controller = null). [...] [kafka-admin-client-thread | adminclient-1] DEBUG o.apache.kafka.clients.NetworkClient - [AdminClient clientId=adminclient-1] Completed connection to node -1. Fetching API versions.
Сотни строк, показывающих, что запрос узлов в кластере не дает записей:
[kafka-admin-client-thread | adminclient-1] DEBUG o.a.k.c.a.i.AdminMetadataManager - [AdminClient clientId=adminclient-1] Updating cluster metadata to Cluster(id = q7XgghZqQUW_o5W2-Nn5Qw, nodes = [], partitions = [], controller = null)
Обратите внимание
nodes = []
расстаться здесь в частности.Это продолжается как минимум несколько секунд, иногда даже 30 секунд! Я не могу понять, почему сервер Kafka не может перечислить себя как узел.
В неудачном случае истекло время ожидания, и я вижу, как выдается позорное исключение:
Exception in thread "main" java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Timed out waiting for a node assignment.
В удачном случае, через некоторое время, он перечисляет себя и может просто подключиться:
[kafka-admin-client-thread | adminclient-1] DEBUG o.a.k.c.a.i.AdminMetadataManager - [AdminClient clientId=adminclient-1] Updating cluster metadata to Cluster(id = q7XgghZqQUW_o5W2-Nn5Qw, nodes = [kafka:9092 (id: 0 rack: null)], partitions = [], controller = kafka:9092 (id: 0 rack: null)) [kafka-admin-client-thread | adminclient-1] DEBUG o.apache.kafka.clients.NetworkClient - [AdminClient clientId=adminclient-1] Initiating connection to node kafka:9092 (id: 0 rack: null) using address kafka/xxxxx
Обратите внимание на наличие
nodes = [kafka:9092 (id: 0 rack: null)]
Вот.
Моя проблема - огромная разница во времени между 1 и 2. Я не понимаю, почему клиенту не дают узел сразу (сам в этом случае!). Это не только замедляет мое автоматическое тестирование, но также мешает прокручивать журналы, полные сбоев с таймаутами, так как он регулярно не подключается в окне тайм-аута по умолчанию. Любая последовательная попытка после достаточно долгого ожидания немедленно соединится просто отлично без всякой странности, хотя...
Клиент Kafka + версии сервера: 2.1.0, работает на Kubernetes. Журналы сервера Kafka не показывают ничего особенного, все молчат уже за несколько секунд до попытки клиента, пока не будет установлено соединение (если вообще).
Что мне здесь не хватает? Я смотрю на случайные откаты давления или я должен сказать Zookeeper/Kafka, что нормально работать самостоятельно, не дожидаясь других узлов?
Я прочитал эту печально известную статью в блоге о конфигурациях слушателей, но в моем случае это не актуально: мой Kafka некоторое время не рекламирует узлы, несмотря на наличие списка рекламируемых хостов. И после этого он просто подключается - те, у кого проблемы с рекламируемыми слушателями, вообще не могут подключиться.