在kafka主题中将多个行文本作为一条消息推送

时间:2018-09-03 14:34:54

标签: apache-kafka kafka-producer-api

我想将包含多行的文本作为一条消息推送到kafka主题中。

输入后:

kafka-console-producer --broker-list localhost:9092 --topic myTopic

并复制我的文字:

My Text consists of:
two lines instead of one

我在kafka主题中收到两条消息,但我只想收到一条。有什么想法要实现吗?谢谢

3 个答案:

答案 0 :(得分:2)

kafka-console-producer无法使用,因为它使用以换行符分隔的Java扫描仪对象。

您需要通过自己的生产者代码完成

答案 1 :(得分:2)

为此,您可以使用kafkacat及其-D运算符来指定自定义消息定界符(在本示例中为/):

kafkacat -b kafka:29092 \
        -t test_topic_01 \
        -D/ \
        -P <<EOF
this is a string message 
with a line break/this is 
another message with two 
line breaks!
EOF

请注意,分隔符必须是一个字节-多字节字符最终将被包含在结果消息See issue #140

产生的消息,也使用kafkacat进行了检查:

$ kafkacat -b kafka:29092 -C \
         -f '\nKey (%K bytes): %k\t\nValue (%S bytes): %s\n\Partition: %p\tOffset: %o\n--\n' \
         -t test_topic_01

Key (-1 bytes):
Value (43 bytes): this is a string message
with a line break
Partition: 0    Offset: 0
--

Key (-1 bytes):
Value (48 bytes): this is
another message with two
line breaks!

Partition: 0    Offset: 1
--
% Reached end of topic test_topic_01 [0] at offset 2

使用kafka-console-consumer进行检查:

$ kafka-console-consumer \
    --bootstrap-server kafka:29092 \
    --topic test_topic_01 \
    --from-beginning

this is a string message
with a line break
this is
another message with two
line breaks!

因此说明了kafkacat为什么比kafka-console-consumer更好用,因为它具有可选的详细程度:)

答案 2 :(得分:1)

使用Console-consumer,您显然正在对来自客户端的预期数据进行测试。如果是单个消息,则最好通过添加唯一的分隔符作为标识符,将其保留为单个字符串。例如

{这是第一行^^这是第二行}

然后在您的消费者工作中相应地处理消息。即使客户计划在消息中发送多个句子,最好将其放在单个字符串中,它也可以改善消息的序列化,并在序列化后效率更高。