Ребалансировка consumer group

Eager, cooperative и KIP-848: чем отличаются протоколы и почему группа встаёт при каждом деплое.

Ребалансировка — перераспределение партиций между участниками группы. Она запускается, когда участник входит или выходит, когда меняется число партиций или когда участник перестал слать heartbeat дольше session.timeout.

Классический (eager) протокол работает как stop-the-world: все участники отдают все свои партиции, координатор считает новое назначение, и только потом группа продолжает работу. При десятках инстансов и тяжёлой инициализации пауза измеряется секундами — и случается при каждом деплое.

Cooperative sticky (KIP-429) отзывает только те партиции, которые реально переезжают. Остальные продолжают обрабатываться, и пауза становится точечной.

KIP-848 переносит расчёт назначения на брокер: координатор сам считает, кому что отдать, и рассылает изменения инкрементально. Клиент перестаёт быть узким местом, а «залипшие» ребалансировки из-за медленного участника уходят. В Kafka 4.3 классический протокол уже пишет предупреждение об устаревании (KIP-1274).

Для требований к интеграции это одна строчка: допустимая пауза обработки при выкатке. Она напрямую зависит от выбранного протокола и от того, сколько времени занимает инициализация консьюмера.

Важное следствие ребалансировки: новый владелец партиции начинает читать с последнего закоммиченного оффсета, а не с того места, где реально остановился прежний. Всё, что было обработано, но не закоммичено, обработается повторно. Именно поэтому обработчик обязан быть идемпотентным.

Разобрать это в симуляторе Интерактивный сценарий: настраиваешь кластер, ломаешь его и смотришь, что происходит

Частые вопросы

Как уменьшить число ребалансировок?

Увеличить session.timeout.ms и max.poll.interval.ms под реальное время обработки, использовать cooperative или KIP-848, включить static membership для управляемых рестартов.

Почему после ребалансировки появляются дубли?

Новый владелец читает с закоммиченного оффсета. Всё обработанное, но не закоммиченное, обрабатывается заново.

Какой протокол выбрать в новом проекте?

KIP-848, если версия кластера и клиента позволяют; иначе cooperative sticky. Классический eager — только для совместимости.

Дальше по теме

Что такое партиция в Kafka Consumer lag: что это и как с ним работать acks в Kafka: 0, 1 и all ISR и min.insync.replicas Retry-топик и DLQ в Kafka