我正在使用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
我想知道还有更好的方法吗?
答案 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