区分二进制编码的Avro和JSON消息

时间:2018-08-06 14:56:02

标签: python apache-kafka avro confluent-schema-registry

我正在使用python读取来自各种主题的消息。有些主题的消息以纯JSON编码,而其他主题则使用Avro二进制序列化和融合的模式注册表。

当我收到一条消息时,我需要知道是否必须对其进行解码。目前,我仅依靠二进制编码的消息以MAGIC_BYTE开头的事实,该值为零:

from confluent_kafka.cimpl import Consumer

consumer = Consumer(config)
consumer.subsrcibe(...)
msg = consumer.poll()
# check the msg is not null or error etc
if msg.values()[0] == 0:
      # It is binary encoded
else:
      # It is json

我想知道还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以简单地首先通过REST查询架构注册表,并为在那里注册的主题构建本地缓存。然后,当您尝试解码来自特定主题的消息时,只需将主题与该列表的内容进行比较即可。如果在那里,您就知道它已被解码。

当然,仅当所有Avro编码的主题都使用Schema Registry时,此方法才有效。如果您收到未在Schema Registry中注册的注册的Avro编码消息,则它将无法正常工作。

答案 1 :(得分:1)

您可能会收到消息的字节0-5,然后

magic_byte = message_bytes[0]
schema_id = message_bytes[1:5]

然后,对您的注册表执行GET /schemas/{schema_id}的查找,并在获得200响应代码时缓存ID +模式(如果需要)。

否则,该消息要么是JSON,要么是生产者已将其数据发送到另一个注册表(如果您的环境中有多个注册表)。 注意:这意味着数据仍然可以是Avro