Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Жизненный цикл

KafkaBroker::new записывает конфигурацию, connect проверяет кластер, старт открывает консьюмер на каждую подписку, а завершение работы отправляет то, что осталось в очереди.

Три состояния брокера как типы и то, что каждый переход делает в KafkaБрокерВ KafkaKafkaBroker::new(servers)ConnectedKafkaBrokerClosedKafkaBrokerunflushed_records()Только конфигурация,без ввода-выводаЗапрос метаданныхв пределах connect_timeoutКаждая подписка:консьюмер вступилв группу и получилпартицииПервая публикацияоткрывает продюсерОтправка ждущихзаписей в пределахflush_timeoutИздатель, переживший соединение,отвечает KafkaError::Closed, а не молчаливым успехом
Схема текстом
  1. Брокер: KafkaBroker::new (servers); ConnectedKafkaBroker; ClosedKafkaBroker unflushed_records()
  2. В Kafka: Только конфигурация, без ввода-вывода; Запрос метаданных в пределах connect_timeout; Каждая подписка: консьюмер вступил в группу и получил партиции; Первая публикация открывает продюсер; Отправка ждущих записей в пределах flush_timeout
  3. KafkaBroker::new (servers) → ConnectedKafkaBroker: connect(self)
  4. ConnectedKafkaBroker → ClosedKafkaBroker unflushed_records(): shutdown(self)
  5. Только конфигурация, без ввода-вывода → Запрос метаданных в пределах connect_timeout
  6. Запрос метаданных в пределах connect_timeout → Каждая подписка: консьюмер вступил в группу и получил партиции
  7. Каждая подписка: консьюмер вступил в группу и получил партиции → Первая публикация открывает продюсер
  8. Первая публикация открывает продюсер → Отправка ждущих записей в пределах flush_timeout
  9. Издатель, переживший соединение, отвечает KafkaError::Closed, а не молчаливым успехом

new не выполняет ввода-вывода, поэтому сборщик сервиса остаётся синхронным. Рантайм подключает брокер при старте приложения. Подключение запрашивает метаданные кластера через временный клиент, собранный из настроек продюсера, в пределах connect_timeout (30 секунд). Старт прерывается, если кластер недоступен или librdkafka отвергает свойство продюсера.

Дескриптор каждой подписки разрешается один раз, по подключённому брокеру. Подписка с группой открывает свой консьюмер и ждёт, пока группа назначит ему партиции и станет известно начало каждой из них. Ожидание ограничено assignment_timeout (одна минута). Пока рантайм не начал чтение, консьюмер продолжает отвечать группе, поэтому перебалансировка его не ждёт. Подписка, которая не называет группу, под брокером без default_group прерывает старт.

Сервис, который только читает, продюсер не запускает. Общий продюсер открывает первая публикация.

Завершение работы помечает соединение закрытым, а затем в пределах flush_timeout (30 секунд) отправляет то, что ещё держит продюсер. ClosedKafkaBroker сообщает о записях, которые остались неотправленными. Консьюмер закрывается, когда удаляется его подписка: он выходит из группы, а если подписка не транзакционная, по пути фиксирует сохранённую позицию.