Создать сообщение Kafka для выбранного раздела

согласно документации Кафки:

производитель отвечает за выбор сообщения, которое следует назначить разделу в рамках темы.

поэтому мой главный вопрос:

как я могу отправить сообщение в выбранный раздел, используя kafka-console-producer.sh (или клиент Java Кафки)?

Я хотел бы указать какой-то 'id раздела' при отправке сообщения. Вероятно, такие "идентификатор раздела" хранится где-то в зоопарке. Знаете ли вы, какое значение (в Zookeeper) идентифицирует раздел Кафки?

4 ответов


kafka-console-producer.sh не поддерживает создание сообщений для определенного раздела из коробки.

однако должно быть довольно просто обновить скрипт, чтобы передать дополнительный параметр для идентификатора раздела, а затем обработать его в пользовательском разделителе, как описано в сообщении @Chiron в модифицированной версии kafka.инструменты.Класс ConsoleProducer.

взгляните на исходный код at:

https://apache.googlesource.com/kafka/+/refs/heads/trunk/bin/kafka-console-producer.sh https://apache.googlesource.com/kafka/+/refs/heads/trunk/core/src/main/scala/kafka/tools/ConsoleProducer.scala


в настоящее время ConsoleProducer кажется, поддерживает написание ключевых сообщений в тему. Кафка будет использовать хэш ключа для распространения сообщения по разделам, по крайней мере, с поведением по умолчанию.

в настоящее время разделителем по умолчанию является \t, чтобы войти key[\t]message распределит его между разделами:

key1    a-message

разделитель можно изменить, предоставив key.separator конфигурации, например:

kafka-console-producer --broker-list localhost:9092,localhost:9093 \
  --topic mytopic --property key.separator=,

отправлять сообщения как это:

key2,another-message

я протестировал это с вкладкой по умолчанию и пользовательским разделителем успешно. Сообщения были распределены по двум отдельным разделам.


В соответствии с текущим положением вещей (Кафка>=0.10.0.1), kafka-console-producer.sh сценарий и базовый класс Java ConsoleProducer поддерживают отправку данных с ключом, но такая поддержка отключена по умолчанию и должна быть включена из CLI.

а именно, вам нужно установить свойство parse.key. Кроме того, если вы хотите использовать что-то отличное от символа вкладки, используйте key.separator как указано в ответе Седрика.

В конце концов, командная строка будет быть:

kafka-console.producer.sh --broker-list kafka:9092,kafka2:9092 \
    --topic $TOPIC --property parse.key=true --property key.separator=|

вот ваша отправная точка:
partitioner.class настройки Properties экземпляра. В Kafka реализация по умолчанию -kafka.producer.DefaultPartitioner.

цель этой настройки:

класс разделителя для разделения сообщений в темах. Разделитель по умолчанию основан на хэше ключа.

это означает, что если вы хотите изменить поведение разделителя по умолчанию, вам нужно создать свой собственный реализация kafka.producer.Partitioner интерфейс.

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