为什么在Kafka REST Proxy中使用base64编码/解码?

时间:2019-07-16 07:35:53

标签: apache-kafka kafka-rest

生产者对消息进行序列化,然后将其以字节数组形式发送给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格式存储消息?

2 个答案:

答案 0 :(得分:1)

enter image description here

当生产者想要发送消息“ Man”时,它将序列化为字节(位)。经纪人会将其存储为010011010110000101101110。当消费者收到此消息时,它将反序列化回给Man。

(如果我错了,请告诉我。我不想误导人们。我会立即对其进行编辑。:))

但是,根据Confluent文件:

  

数据格式-REST代理可以使用JSON,使用base64编码的原始字节或使用JSON编码的Avro读写数据。

enter image description here

因此,使用REST代理的生产者会将消息Man更改为TWFu(base64编码)并将其发送给代理,而使用REST Proxy的使用者将base64将此消息解码回{{ 1}}。

(如果我误解了,请指正。)

随着我了解更多信息,我将对其进行编辑和补充。

enter image description here

答案 1 :(得分:0)

正如您已经回答的那样,经纪人总是以二进制格式存储数据。

回答为什么需要 base 64 而我在融合文档 (https://www.confluent.io/blog/a-comprehensive-rest-proxy-for-kafka/) 上找到了这个:

当您必须通过 Rest 代理发送原始二进制数据时,使用 base64 编码的必要性更加明显:

<块引用>

如果您选择使用原始二进制数据,它不能直接嵌入到 JSON 中,因此 API 使用包含 base64 编码数据的字符串。