生产者对消息进行序列化,然后将其以字节数组形式发送给Broker。消费者反序列化那些字节数组。代理始终存储并传递字节数组。这就是我的理解。
但是,当您在 Kafka 中使用 REST代理时,生产者使用base64对消息进行编码,而消费者使用这些base64消息进行解码。
生产者和消费者的Python示例:
# Producer using the REST Proxy
payload = {"records" :
[{
"key":base64.b64encode("firstkey"),
"value":base64.b64encode("firstvalue")
}]}
# Consumer using the REST Proxy
print "Message Key:" + base64.b64decode(message["key"])
为什么要在base64中将消息发送给Broker,而不是字节数组? 使用REST代理时,代理是否以base64格式存储消息?
答案 0 :(得分:1)
当生产者想要发送消息“ Man”时,它将序列化为字节(位)。经纪人会将其存储为010011010110000101101110
。当消费者收到此消息时,它将反序列化回给Man。
(如果我错了,请告诉我。我不想误导人们。我会立即对其进行编辑。:))
但是,根据Confluent文件:
数据格式-REST代理可以使用JSON,使用base64编码的原始字节或使用JSON编码的Avro读写数据。
因此,使用REST代理的生产者会将消息Man
更改为TWFu
(base64编码)并将其发送给代理,而使用REST Proxy的使用者将base64将此消息解码回{{ 1}}。
(如果我误解了,请指正。)
随着我了解更多信息,我将对其进行编辑和补充。
答案 1 :(得分:0)
正如您已经回答的那样,经纪人总是以二进制格式存储数据。
回答为什么需要 base 64 而我在融合文档 (https://www.confluent.io/blog/a-comprehensive-rest-proxy-for-kafka/) 上找到了这个:
当您必须通过 Rest 代理发送原始二进制数据时,使用 base64 编码的必要性更加明显:
<块引用>如果您选择使用原始二进制数据,它不能直接嵌入到 JSON 中,因此 API 使用包含 base64 编码数据的字符串。