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

时间:2016-04-15 04:21:18

标签: apache-kafka avro kafka-consumer-api

我尝试将我的java对象发布/使用到kafka。我使用Avro架构。

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

如果我在接收器上向不同主题发布不同的对象(例如:100个主题),我不知道,我收到了什么类型的消息?..我想从收到的字节中获取avro架构并希望用它来解码.. 我的理解是否正确?如果是这样,我如何从收到的对象中检索?

1 个答案:

答案 0 :(得分:1)

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

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

至于找出哪个架构与哪个主题相关,正如我在 a previous answer 中所说,您需要每个主题一个架构,不再需要。因此,当您解析来自特定主题的消息时,您确切知道应用了哪种模式,因为只能有一个。

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

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

您可以将每个主题的单个记录与Avro编码的映射一起发布到一个特殊主题中 - 例如称为SchemaMapping - 并且从一开始就使用Schema主题后,消费者会听取SchemaMapping之后,它会确切知道应用于每个主题的模式。