Как Kafka producer выбирает партицию для сообщения?
- Как 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?
Разбор темы
- Kafka Producer
Запись и сериализация, выбор партиции, батчинг и сжатие, acks и долговечность, идемпотентный producer и транзакции.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.