Получить доступ

Как Kafka producer выбирает партицию для сообщения?

MiddleKafka ProducerKafka
Ещё спрашивают так:
  • Как Kafka решает, в какую партицию писать сообщение?
Коротко

С ключом — партиция = murmur2(key) % число партиций: одинаковый ключ — всегда одна партиция и порядок. Без ключа — sticky partitioner: пачка уходит в одну партицию, следующая — в другую.

  • Можно указать партицию явно или написать свой Partitioner
  • Горячий ключ — горячая партиция
  • Изменение числа партиций меняет партицию для ключа

А ещё До Kafka 2.4 сообщения без ключа раскладывались round-robin по одному — хуже для пакетов

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Ключ задан — DefaultPartitioner считает murmur2(keyBytes) % numPartitions (по модулю положительного значения хеша). Все сообщения с одним ключом идут в одну партицию, поэтому сохраняется порядок событий сущности, и все её события обрабатывает один потребитель группы.

Ключа нет — с Kafka 2.4 работает sticky partitioner: продюсер заполняет пакет для одной партиции и переключается на другую, когда пакет отправлен. Пакеты получаются больше, задержка меньше, чем при раскладке по одному сообщению round-robin. С Kafka 3.3 — адаптивная версия, которая реже выбирает медленные брокеры.

Явно — указать номер партиции в ProducerRecord или реализовать свой Partitioner (например, выделить отдельные партиции для крупных клиентов).

Подводные камни:

  • перекос — популярный ключ создаёт горячую партицию и перегруженного потребителя;
  • увеличение числа партиций — меняет результат % N, события ключа начинают идти в другую партицию;
  • разные клиенты (Java, librdkafka) могут использовать разные хеши по умолчанию — один ключ попадёт в разные партиции из разных языков.

Что хотят услышать

  • Хеш ключа по модулю числа партиций.
  • Поведение без ключа: sticky partitioner.
  • Явная партиция и свой Partitioner.
  • Горячие ключи и увеличение числа партиций.

Частые ошибки

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

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Случайно равномерно, без учёта key
  • ✗Всегда в партицию 0, остальные используются только для репликации
  • ✗По размеру сообщения: маленькие в одну партицию, большие в другую
  • ✓Если задан key — hash(key) % numPartitions (одинаковый ключ → одна партиция, порядок per-ключ); без key — sticky/round-robin для лучшего батчинга

Что спросят дальше

  • Что делает custom Partitioner?
  • Что будет при hot key?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем