我正在使用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
个字节。我无法在文档中的任何地方找到对此声明的解释。
答案 0 :(得分:2)
密钥属于bytes
类型。字节使用signed int32
来指定数据长度。
如果密钥为null
,则长度设置为-1
。 -1
作为signed int32
的表示形式为255,255,255,255
(0xffffffff
)
消息值类似。首先,您的长度为signed int32
,0,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。