Создать сообщение 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
интерфейс.
Я бы предложил быть очень осторожным при создании собственной стратегии и действительно, протестировать ее много и контролировать свои темы и их разделы.