2

Producer 将消息序列化并以字节数组的形式发送给 Broker。消费者反序列化这些字节数组。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 代理时,Broker 以 base64 格式存储消息?

4

2 回答 2

4

在此处输入图像描述

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

但是,根据 Confluent 文档:

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

在此处输入图像描述

因此,使用 REST 代理的生产者会将消息更改ManTWFu(base64 编码)并将其发送给代理,使用 REST 代理的消费者会将其通过 base64 解码回Man.

在此处输入图像描述

于 2019-07-17T00:34:11.200 回答
0

正如您已经回答的那样,代理始终以二进制格式存储数据。

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

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

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

于 2021-05-28T11:49:31.660 回答