Apache Kafka - сообщение без ключа

Просматривая определенное руководство по кафке, я наткнулся на эту фразу

Если ключ равен нулю и используется разделитель по умолчанию, запись будет отправлена ​​в один из доступных разделов темы в случайном порядке. Для балансировки сообщений между разделами будет использоваться алгоритм циклического перебора.

Означает ли это, что это применимо только для использования разделителя по умолчанию?


person Nag    schedule 05.06.2020    source источник


Ответы (2)


  • Если указан допустимый номер раздела, этот раздел будет использоваться при отправке записи.

  • Если раздел не указан, но ключ присутствует, раздел будет выбран с использованием хэша ключа (DefaultPartitioner - подробнее см. Ниже).

  • Если ни ключа, ни раздела нет, раздел будет назначен циклически.


Kafka использует тег _ 2_ (org.apache.kafka.clients.producer.internals.DefaultPartitioner) для распределения сообщений по разделам тем:

/**
 * Compute the partition for the given record.
 *
 * @param topic The topic name
 * @param key The key to partition on (or null if no key)
 * @param keyBytes serialized key to partition on (or null if no key)
 * @param value The value to partition on or null
 * @param valueBytes serialized value to partition on or null
 * @param cluster The current cluster metadata
 */
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
    if (keyBytes == null) {
        return stickyPartitionCache.partition(topic, cluster);
    } 
    List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
    int numPartitions = partitions.size();
    // hash the keyBytes to choose a partition
    return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}

По сути, DefaultPartitioner использует MurmurHash, некриптографическую хеш-функцию, которая обычно используется для поиска по хешам. Этот хэш затем используется в операции по модулю (% numPartitions), чтобы гарантировать, что возвращаемый раздел находится в диапазоне [0, N], где N - количество разделов темы.

person Giorgos Myrianthous    schedule 05.06.2020
comment
Что делать, если добавить / удалить раздел? запись с тем же ключом будет отображаться на другой раздел, так как это по модулю? - person Wuaner; 17.05.2021

Ну, нет, вы можете реализовать настраиваемый разделитель для обработки null ключей. Но без ключей сообщений ваш пользовательский разделитель должен вести себя как разделитель по умолчанию (даже с использованием простого случайного алгоритма). В противном случае, как он может определить правильный раздел для отправки сообщения?

Как мягкое правило, если ключ не указан, используйте средство разделения по умолчанию.

Хороший документ о специальном разделителе Kafka.

person Matteo Baldi    schedule 05.06.2020