Статьи

Custom Partitioner в Kafka Использование Scala: быстрый тур!

В этом блоге мы собираемся исследовать разделитель Kafka. Мы попытаемся понять, почему разделителя по умолчанию недостаточно, и когда вам может понадобиться специальный разделитель. Мы также рассмотрим вариант использования и создадим код для пользовательского разделителя. Я предполагаю, что вы хорошо знакомы с Кафкой. Давайте разберемся с поведением разделителя по умолчанию.

Разделитель по умолчанию следует этим правилам:

  1. Если производитель указывает номер раздела в записи сообщения, используйте его.
  2. Если производитель не предоставляет номер раздела, но предоставляет ключ, выберите раздел, основываясь на хэш-значении ключа.
  3. Если номер раздела или ключ отсутствуют, выберите раздел в циклическом порядке.

Таким образом, вы можете использовать разделитель по умолчанию в трех сценариях:

  1. Если вы уже знаете номер раздела, в который хотите отправить запись сообщения, используйте первое правило.
  2. Если вы хотите распространять данные на основе хеш-ключа, вы будете использовать второе правило стандартного разделителя.
  3. Если вам не важно, какая запись сообщения раздела будет сохранена, тогда вы будете использовать третье правило разделителя по умолчанию.

Есть две проблемы с ключом:

  1. Если производитель предоставляет один и тот же ключ для каждой записи сообщения, то хэширование даст вам тот же хэш-номер, но не гарантирует, что если вы предоставите два разных ключа, то оно никогда не даст вам один и тот же хэш-номер. 
  2. Разделитель по умолчанию использует хеш-значение ключа и общее количество разделов в теме, чтобы определить номер раздела. Если вы увеличите номер раздела, разделитель по умолчанию вернет разные номера, даже если вы предоставите один и тот же ключ.

Теперь у вас могут возникнуть вопросы о том, как решить эту проблему.

Ответ на этот вопрос очень прост: вы можете реализовать свой алгоритм на основе ваших требований и использовать его в пользовательском разделителе.


Вам также может понравиться:
Kafka Internals: темы и разделы .

Kafka Custom Partitioner Пример

Давайте создадим пример варианта использования и реализуем пользовательский разделитель. Попытайтесь понять постановку проблемы с помощью диаграммы.


Предположим, мы собираем данные из разных отделов. Все отделы отправляют данные в одну тему с именем отдел. Я запланировал пять разделов по теме. Но я хочу, чтобы два раздела были выделены для конкретного отдела под названием ИТ, а остальные три — для остальных отделов. Как бы вы достигли этого?

Вы можете решить это требование и любые другие требования к разделению, внедрив пользовательский разделитель.

Кафка Продюсер

Давайте посмотрим на код производителя.


Scala