#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 ах, я не знал. спасибо за вашу помощь.