JSON 的反序列化和没有 Schema 的 Avro

Deserialization of JSON and Avro without Schema

我一直在尝试在没有融合架构注册表的情况下实施 Avro 反序列化。快速 research 显示我可以在将记录发送到主题之前将架构嵌入 header 中。但是在嵌入到 header 之前,架构必须再次序列化为字节,这再次导致了这个问题。有什么办法可以实现吗?

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

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

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

A quick research shows that I can embed the schema in header before sending the record to topic

可以,是的。请注意,Confluent 序列化器不使用 headers,如果您正在关注它们的源代码。

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

the schema again has to be serialized to bytes before embedding on the header

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

What are what are the cons associated with this approach.

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

How is it possible for confluent to extract schema from the data and store it in schema registry?

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

Isn't the data serialized before sending to schema registry?

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

JsonDeserialzier, it deserializes data without any schema and works with JsonNode. Why isn't a similar mechanism possible for Avro?

我认为您应该比较 JsonSchemaDeserializer class。显然,plain JSON 没有模式的概念。 Avro 需要 反序列化的reader 模式,但有一个类似的机制 - GenericRecord 与 JsonNode

的操作类似