【问题标题】:Deserialization of JSON and Avro without Schema没有 Schema 的 JSON 和 Avro 反序列化
【发布时间】:2021-06-12 10:41:53
【问题描述】:

我一直在尝试在没有融合模式注册表的情况下实现 Avro 反序列化。一个快速的research 表明我可以在将记录发送到主题之前将模式嵌入到标题中。但是模式在嵌入到标头之前必须再次序列化为字节,这再次使这成为问题。有没有办法做到这一点?

与这种方法相关的缺点是什么。

confluent 如何从数据中提取模式并将其存储在模式注册表中?我知道模式注册表在将数据发送到主题时在记录头上嵌入了模式 id。数据在发送到模式注册表之前不是序列化的吗?

如果我们再看一下 Confluent JsonDeserialzier,它会在没有任何架构的情况下反序列化数据并与 JsonNode 一起使用。为什么 Avro 不能使用类似的机制?

【问题讨论】:

  • “我一直在尝试在没有融合模式注册表的情况下实现 Avro 反序列化” 您能否编辑您的问题以包含此要求的动机?这将使更准确和更有用的回答更容易:)
  • @RobinMoffatt 我一直在尝试创建一个实验来检查如何为 POC 项目实现 avroserialization 和反序列化,当然我不能处理模式,因为会有一个很多。但是到目前为止我所看到的所有示例都与模式注册表有关,我需要知道如何在不需要模式注册表的情况下实现它。但是随着我越来越多地研究这个模式注册表变得难以接受。如果您能就这个问题提出您的想法,我将不胜感激。
  • 我还是不明白你为什么不想使用模式注册表。它们有一个非常有用的目的。
  • @RobinMoffatt 正如我所说,我正在试验,很想了解底层细节
  • 首先,Kafka 没有使用“标题”,链接的问题是针对 Avro 容器文件的。其次,Confluent 序列化器是开源的,因此您可以观察它们是如何工作的

标签: java json avro confluent-schema-registry


【解决方案1】:

一项快速研究表明,我可以在将记录发送到主题之前将架构嵌入标题中

你可以,是的。请注意,如果您遵循它们的源代码,Confluent 序列化程序不会使用标头。

标题值也必须是字符串或字节,我上次检查过。

在嵌入到标头之前,模式必须再次序列化为字节

不确定您的“再次”是什么意思。对于每条消息,是的,并且没有办法解决这个问题,但不是在序列化单个记录的同一过程中。

与这种方法相关的缺点是什么。

有大量关于使用注册表的优点的文档。缺点包括维护额外的基础架构,并非所有工具都可以与之集成。

confluent 如何从数据中提取模式并将其存储在模式注册表中?

参考source code (extract Schema as text) 然后POST schema text to the registry to get the ID and embed in the record

数据在发送到架构注册表之前不是序列化了吗?

如果“序列化”是指 Avro,那么是的,但架构是 UTF8 序列化的

JsonDeserialzier,它可以在没有任何模式的情况下反序列化数据并与 JsonNode 一起使用。为什么 Avro 不可能有类似的机制?

我认为您应该比较 JsonSchemaDeserializer 类。显然,纯 JSON 没有模式的概念。 Avro 需要一个读取器模式进行反序列化,但有一个类似的机制 - GenericRecord 的操作类似于 JsonNode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多