Для целей интеграционного тестирования я создаю очень простое развертывание Kafka с одним узлом:
(Все аккуратно развернуто в свежих контейнерах 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 какое-то время не рекламирует узел (ы), пока не сделает это, несмотря на наличие списка объявленных хостов. И после этого он отлично подключается - те, у кого есть проблемы с рекламируемыми слушателями, не могут подключиться вообще.