Когда возникает ребалансировка в Kafka?
Что проверяют
Знаете ли вы механику consumer group на уровне конфигов, а не общих слов. Классический уточняющий вопрос: сервис постоянно ребалансируется и получает дубли, где искать причину.
Как отвечать
Ребалансировка это перераспределение партиций между участниками одной consumer group. Её запускает изменение состава группы или подписки:
- новый участник: подняли ещё один экземпляр сервиса или перезапустили старый;
- штатный выход:
consumer.close()сообщает координатору, что участник покидает группу; - пропавшие heartbeat: процесс упал или завис, и координатор не получал сигналов дольше
session.timeout.ms(по умолчанию 45 секунд начиная с Kafka 3.0); - долгая обработка: между вызовами
poll()прошло большеmax.poll.interval.ms(по умолчанию 5 минут), и клиент сам выходит из группы; - изменение подписки: новый топик под шаблон в
subscribe()или добавленные партиции.
Падение брокера само по себе ребалансировку группы не вызывает: там выбирается новый лидер партиции, это другой механизм.
Как смягчить последствия:
CooperativeStickyAssignor: инкрементальная ребалансировка, у участников забирают только переезжающие партиции, а не все сразу, как в eager-протоколе;- статическое членство:
group.instance.idпозволяет перезапустить экземпляр без ребалансировки, если он вернулся в пределах таймаута сессии; - новый протокол групп (KIP-848):
group.protocol=consumer, назначение считает брокер, общего барьера для всей группы нет. В Kafka 4.0 он стал общедоступным; ConsumerRebalanceListener: вonPartitionsRevokedкоммитят обработанные смещения, чтобы новый владелец их не перечитал.
Где спотыкаются
Путают ребалансировку группы с переизбранием лидера партиции после отказа брокера и называют это главной причиной.
Держат тяжёлую обработку прямо в цикле poll() при max.poll.records по умолчанию 500. Пачка не успевает за max.poll.interval.ms, потребитель выпадает, группа ребалансируется, и всё повторяется по кругу.
Говорят, что ребалансировка теряет сообщения. Обычно она даёт дубли: незакоммиченное перечитает новый владелец, поэтому обработка должна быть идемпотентной.