当密钥为空时,ProducerRequest发送[... 255,255,255,255 ..]

时间:2018-02-17 13:52:23

标签: apache-kafka protocols kafka-producer-api

我正在使用options客户端,我正在尝试了解kafka协议。我有这个基本的生成器示例,它发送message而没有key

producer.send([
    { topic: "mytopic", messages: ["hi"] },
], 

如果我分析消息的框架(tcpdump),我得到:

[
    79,   CRC
    44,
    52,
    245,  END CRC
    0,    magic_byte
    0,    partitions
    255,  ================= 
    255,
    255,
    255, ==================
    0,   size message begin 
    0,
    0,
    2,   size message end
    104,  'h'
    105,  'i'
]

所以我不明白为什么当密钥为空时我在4处有255个字节。我无法在文档中的任何地方找到对此声明的解释。

1 个答案:

答案 0 :(得分:2)

密钥属于bytes类型。字节使用signed int32来指定数据长度。

如果密钥为null,则长度设置为-1-1作为signed int32的表示形式为255,255,255,2550xffffffff

消息值类似。首先,您的长度为signed int320,0,0,2,后跟实际的2个字节。

[
    79,   CRC
    44,
    52,
    245,  END CRC
    0,    magic_byte
    0,    partitions
    255,  size key begin 
    255,  -1 as the key is null
    255,
    255, size key end
    0,   size message begin 
    0,
    0,
    2,   size message end
    104,  'h'
    105,  'i' ]

请参阅“卡夫卡协议指南”中的此部分:http://kafka.apache.org/protocol#protocol_types

  

bytes,string - 这些类型由一个带符号的整数组成   长度N后跟N个字节的内容。长度为-1表示   空值。 string使用int16作为其大小,bytes使用int32。