Как Kafka выбирает раздел для ключа?

#apache-kafka

#apache-kafka

Вопрос:

Предположим, что количество разделов фиксировано для темы. И предположим, что я предоставляю ключ — массив байтов — при публикации сообщения. Kafka сопоставит ключ с разделом темы 0,1,2,3, … N-1.

Я хотел бы создать функцию, которая делает то же самое: задается N, и ключ возвращает тот же номер раздела, что и Kafka.

Это просто (в псевдокоде) murmur3 (ключ) % N?

TIA

Ответ №1:

DefaultPartitioner использует murmur3 функцию для вычисления раздела для сообщений с ненулевыми ключами.

Вы можете просто извлечь алгоритм и добавить в свой код:

 import org.apache.kafka.common.utils.Utils;
Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
  

Второй вариант — просто использовать DefaultPartitioner :

 DefaultPartitioner partitioner = new DefaultPartitioner();
int partition = partitioner.partition(???, ???, ???, ???, ???, ???);
  

Комментарии:

1. Спасибо, это именно то, что мне было нужно. import org.apache.kafka.clients.producer.internals.DefaultPartitioner

Ответ №2:

Насколько я знаю, Kafka хэширует ключ и раздел в соответствии с этим значением хэша. Вот полезная схема и пример того, как это делается.

Utils.abs(java.util.Массивы.Хэш-код(key.asInstanceOf[Массив[байт])) % numPartitions

введите описание изображения здесь

Только что нашел еще один хороший пример разделения!

введите описание изображения здесь

Комментарии:

1. hashCode () не согласован с реализациями JVM, так что это неправильная функция

2. @cricket_007 ах, я не знал. спасибо за вашу помощь.