Назад | Перейти на главную страницу

Брокер Kafka выводит список пустых узлов * на некоторое время *

Для целей интеграционного тестирования я создаю очень простое развертывание Kafka с одним узлом:

(Все аккуратно развернуто в свежих контейнерах Docker.)

Я вижу периодические сбои при подключении от клиента к Kafka, но всякий раз, когда я пытаюсь подключиться снова, он просто подключается нормально. Я включил ведение журнала отладки на клиенте Kafka, и вот что я вижу при первом подключении:

  1. Клиент отлично подключается к настроенному серверу начальной загрузки:

    [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.
    
  2. Сотни строк, показывающих, что запрос узлов в кластере не дает записей:

    [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.
    
  3. В удачном случае, через некоторое время, он перечислит себя и может нормально подключиться:

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