По какому принципу работает связка Kafka - Kafka Consumer с точки зрения сетевого взаимодействия и как происходит доставка сообщений
Что проверяют
Понимаете ли вы, что консьюмер забирает сообщения сам, и различаете ли гарантии доставки, которые настраиваются, от свойств, которые брокер даёт по умолчанию. Вопрос отсеивает тех, кто знает Kafka только по уровню аннотаций в Spring.
Как отвечать
По сети это собственный бинарный протокол поверх TCP. Консьюмер держит соединения с брокерами, где лежат лидеры его партиций, плюс отдельное соединение с координатором группы. Адреса из bootstrap.servers нужны только для первого запроса метаданных, дальше клиент ходит напрямую.
Модель тянущая: poll() отправляет fetch-запрос, а брокер отвечает, когда наберётся fetch.min.bytes или истечёт fetch.max.wait.ms. Это длинный опрос, а не поток от сервера, поэтому скорость потребления задаёт сам консьюмер.
Группа делит партиции: одна партиция в один момент читается одним консьюмером группы, лишние участники простаивают. Вход и выход участника вызывает ребалансировку, назначение раздаёт координатор. За живостью следят два разных таймаута: фоновые heartbeat закрывает session.timeout.ms, а слишком долгую обработку батча ловит max.poll.interval.ms.
Позиция чтения это оффсет, он хранится в служебном топике. Отсюда и гарантии: коммит до обработки даёт «максимум один раз», коммит после обработки даёт «минимум один раз» и требует идемпотентного обработчика, а ровно один раз в пределах Kafka собирается из идемпотентного продюсера, транзакций и чтения в режиме read_committed.
Где спотыкаются
Говорят, что брокер рассылает сообщения консьюмерам. В Kafka наоборот, и это осознанное решение: медленный потребитель не захлёбывается, а просто отстаёт по оффсету.
Называют «минимум один раз» свойством Kafka. Это результат ваших настроек, и одно приложение можно собрать с любой из трёх гарантий, просто переставив коммит и поменяв acks.
Ссылаются на встроенную очередь недоставленных сообщений. В брокере её нет: это обычный топик, который заводят руками, а готовые механизмы живут в обвязке вроде Kafka Connect или Spring Kafka.