Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Жизненный цикл
KafkaBroker::new записывает конфигурацию, connect
проверяет кластер, старт открывает консьюмер на каждую подписку, а завершение работы отправляет
то, что осталось в очереди.
Схема текстом
- Брокер: KafkaBroker::new (servers); ConnectedKafkaBroker; ClosedKafkaBroker unflushed_records()
- В Kafka: Только конфигурация, без ввода-вывода; Запрос метаданных в пределах connect_timeout; Каждая подписка: консьюмер вступил в группу и получил партиции; Первая публикация открывает продюсер; Отправка ждущих записей в пределах flush_timeout
- KafkaBroker::new (servers) → ConnectedKafkaBroker: connect(self)
- ConnectedKafkaBroker → ClosedKafkaBroker unflushed_records(): shutdown(self)
- Только конфигурация, без ввода-вывода → Запрос метаданных в пределах connect_timeout
- Запрос метаданных в пределах connect_timeout → Каждая подписка: консьюмер вступил в группу и получил партиции
- Каждая подписка: консьюмер вступил в группу и получил партиции → Первая публикация открывает продюсер
- Первая публикация открывает продюсер → Отправка ждущих записей в пределах flush_timeout
- Издатель, переживший соединение, отвечает KafkaError::Closed, а не молчаливым успехом
new не выполняет ввода-вывода, поэтому сборщик сервиса остаётся синхронным. Рантайм подключает
брокер при старте приложения. Подключение запрашивает метаданные кластера через временный клиент,
собранный из настроек продюсера, в пределах
connect_timeout (30 секунд). Старт
прерывается, если кластер недоступен или librdkafka отвергает свойство продюсера.
Дескриптор каждой подписки разрешается один раз, по подключённому брокеру. Подписка с группой
открывает свой консьюмер и ждёт, пока группа назначит ему партиции и станет известно начало каждой
из них. Ожидание ограничено
assignment_timeout (одна минута).
Пока рантайм не начал чтение, консьюмер продолжает отвечать группе, поэтому перебалансировка его
не ждёт. Подписка, которая не называет группу, под брокером без
default_group прерывает старт.
Сервис, который только читает, продюсер не запускает. Общий продюсер открывает первая публикация.
Завершение работы помечает соединение закрытым, а затем в пределах
flush_timeout (30 секунд) отправляет то,
что ещё держит продюсер. ClosedKafkaBroker
сообщает о записях, которые остались неотправленными. Консьюмер закрывается, когда удаляется его
подписка: он выходит из группы, а если подписка не транзакционная, по пути фиксирует сохранённую
позицию.