【问题标题】:How can i get the Avro schema object from the received message in kafka?如何从 kafka 中收到的消息中获取 Avro 模式对象?
【发布时间】:2016-08-06 21:35:04
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案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 主题之后,消费者将收听 @987654328 @ 然后它会确切地知道为每个主题应用哪个模式。

【讨论】:

  • 谢谢大卫,你能提供一个代码示例吗?我有点困惑
  • 到底有什么令人困惑的地方?
  • AFAIU,我们将消费来自 100 个主题的消息,包括“模式”主题?如果是这样,我们是否需要将来自“模式”主题的消费消息(即:avro 模式)存储在队列中?那么只有我们可以将模式与从其他主题接收到的数据进行匹配吗?我想看看这个的java代码示例
  • @DavidGriffin 关于这一点:您不会在接收到的字节中收到 Avro 架构,我在 Avro 规范中读到“Avro 数据始终与其架构进行序列化。存储 Avro 数据的文件应始终还将该数据的架构包含在同一个文件中”架构最终是否与数据一起旅行?顺便说一句,我的用例很相似,但使用的是 RabbitMQ 而不是 kafka
  • 它不会随数据一起传播。对于流式应用程序,您必须单独管理方案而不是数据。对于平面文件,您可以在其中存储架构的标题部分。但是在流中没有标头的概念,因此您必须将方案存储在单独的位置。在我的应用程序中,每个流都有一个与之关联的特定模式,并且我有一个将 avro 模式映射到流的数据库。
猜你喜欢
  • 2018-11-04
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2018-12-30
  • 2021-12-28
  • 2021-04-13
  • 2022-11-25
  • 2023-03-13
相关资源
最近更新 更多