Kafka rebalance на собеседовании Data Engineer

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем спрашивают на собесе DE

Rebalance — частая боль Kafka в проде. На собесе DE: «как уменьшить rebalance», «cooperative vs eager».

Когда происходит rebalance

Triggers:

  • Consumer joins group.
  • Consumer leaves (graceful или crash).
  • Consumer не sends heartbeat в session.timeout.ms.
  • Topic partitions changed.
  • max.poll.interval.ms exceeded (consumer думал что обрабатывает, но вышел за лимит).

Stop-the-world проблема

В классическом (eager) protocol rebalance:

  1. Coordinator triggers rebalance.
  2. Все consumers stop processing.
  3. Revoke all partitions.
  4. New assignment computed.
  5. Consumers re-subscribe.
  6. Resume processing.

Время: секунды-минуты на больших groups.

Impact:

  • Lag растёт во время rebalance.
  • При частых rebalances — pipeline постоянно простаивает.
  • Каждый rebalance — opportunity for ошибок (offset commit).

Static membership

Kafka 2.4+. Consumer фиксирует ID между restarts.

group.instance.id=consumer-1

При коротких restart (< session.timeout.ms) — Kafka understand тот же consumer вернулся, не triggers rebalance.

Use case. Deployments / restarts на k8s.

Caveats:

  • Если consumer died (не restarted) — лучше подождать session.timeout.ms.
  • Increase session.timeout.ms — допустимый downtime до rebalance.
Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Incremental cooperative

Kafka 2.4+, default с 3.0.

CooperativeStickyAssignor.

Вместо stop-the-world:

  1. Tell each consumer keep current assignment.
  2. Compute new assignment.
  3. Difference — only changed partitions are revoked.
  4. Other consumers continue processing.

Только partitions, нужные для re-assignment, паузнуты.

spring.kafka.consumer.properties.partition.assignment.strategy=org.apache.kafka.clients.consumer.CooperativeStickyAssignor

В новых apps — should be default.

Best practices

1. Use cooperative + static membership. Минимум disruptions.

2. Tune session.timeout.ms и heartbeat.interval.ms. Дефолт 45s / 3s. Lower — faster failure detection. Higher — больше allowance.

3. max.poll.interval.ms. Должен покрывать longest processing time. Default 5 min.

4. Smaller batches. max.poll.records низкий → faster processing per poll.

5. Process в background thread. Чтобы main thread всегда poll'ит. Async commit.

6. Monitor rebalance frequency. Метрики kafka_consumer_coordinator_rebalance_rate.

Связанные темы

FAQ

Sticky vs Range assignor?

Range — простой, partitions делятся диапазонами. Sticky — сохраняет существующие assignments при rebalance, минимизирует movement.

Это официальная информация?

Нет. Статья основана на документации Apache Kafka 3.x.


Тренируйте Data Engineering — откройте тренажёр с 1500+ вопросами для собесов.