Статьи

Custom Partitioner в Кафке: давайте совершим краткий тур!

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

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

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

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

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


Вам также могут понравиться:
Kafka Producer и Consumer Примеры использования Java .

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

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

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

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

Kafka Custom Partitioner Пример

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


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

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

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

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


Scala