Вопрос с собеседования · Брокеры сообщений

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

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

Показать варианты и ответ
  • ✗Всегда в партицию 0, остальные используются только для репликации
  • ✓По hash(key) % числа партиций, без ключа — sticky
  • ✗По размеру сообщения: маленькие в одну партицию, а крупные — в отдельную другую
  • ✗Брокер сам выбирает наименее загруженную партицию в момент записи

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования