如何从 kafka 中收到的消息中获取 Avro 模式对象?

How can i get the Avro schema object from the received message in kafka?

我尝试 publish/consume 我的 java 对象到 kafka。我使用 Avro 模式。

我的基本程序运行良好。在我的程序中,我在生产者(编码)和消费者(解码)中使用我的模式。

如果我在接收方将不同的对象发布到不同的主题(例如:100 个主题),我不知道我收到的是什么类型的消息?...我想从接收到的字节中获取 avro 模式,并且想用它来解码.. 我的理解正确吗?如果是这样,我如何从接收到的对象中检索?

您不会在接收到的字节中收到 Avro 架构——而且您真的不想这样做。 Avro 的整个想法是将模式与记录分开,因此它是一种更加紧凑的格式。我这样做的方式是,我有一个名为 Schema 的主题。 Kafka 消费者进程做的第一件事是从头开始收听此主题并解析所有模式。

Avro 模式只是 JSON 字符串对象 -- 您可以在 Schema 主题中为每条记录存储一个模式。

关于确定哪个模式与哪个主题相关,正如我在 中所说,您需要每个主题一个模式,仅此而已。因此,当您解析来自特定主题的消息时,您确切地知道适用什么架构,因为只能有一个。

如果您从不重复使用架构,您可以将架构命名为与主题相同的名称。但是,在实践中,您可能会在多个主题上使用相同的模式。在这种情况下,您希望有一个单独的主题将模式映射到主题。您可以像这样创建 Avro 模式:

{"name":"SchemaMapping", "type":"record", "fields":[
  {"name":"schemaName", "type":"string"},
  {"name":"topicName", "type":"string"}
]}

您将为每个主题发布一条记录,并将您的 Avro 编码映射到一个特殊主题——例如称为 SchemaMapping——并且在从头开始使用 Schema 主题后,一个消费者会收听 SchemaMapping,然后它会确切地知道为每个主题应用哪个模式。