【问题标题】:Kafka avro serialization with schema evolution带有模式演变的 Kafka avro 序列化
【发布时间】:2018-10-25 09:50:21
【问题描述】:

我正在尝试构建一个 kakfa 管道,它将 JSON 输入数据读入 Kafka 主题。
我正在使用带有模式注册表的 AVRO 序列化,因为我的模式会定期更改。
到目前为止,GenericRecord 用于解析模式。
但我最近才知道 avro-tools 可用于读取模式并生成可用于创建生产者代码的 Java 类。
我很困惑在这两个选项之间进行选择。
您能否建议我哪个更好,因为我的架构经常更改?

【问题讨论】:

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


    【解决方案1】:

    avro-tools 可用于读取架构并生成可用于创建生产者代码的 java 类

    他们创建特定的 Avro 类,而不是生产者代码,而是针对问题。两者都会起作用。

    我的看法

    • GenericRecord - 将其视为HashMap<String, Object>。作为消费者需要知道要获取的字段。如果作为生产者或模式创建者,您无法将您的类作为库发送给您的消费者,那么这基本上是您可以获得的最好的。不过,我相信您将始终能够获得最新数据(所有可能的字段都可以通过get("fieldname") 调用访问。See example here
    • SpecificRecordavro-tools 生成的内容)——它只是一个带有 getter 方法和 builder 对象/setter 方法的生成类。任何消费者都可以将您的生产者类作为依赖项导入,反序列化消息,然后立即知道哪些字段可用。不能保证您在这里获得最新的架构 - 您将被“降级”并仅限于用于生成这些类的任何架构。

    我通常使用avro-maven-plugin 创建类。 Just as this example

    您也可以使用 Java 类中的AvroReflect to build an Avro schema,而不是相反。 Annotations can be used 在字段上设置 @Union@AvroDefault 设置。

    Further Reading about using the Confluent Schema Registry

    【讨论】:

    • 感谢您的回复。因此,在我的情况下,由于模式经常更改,我需要使用 GenericRecord 方法来确保最新模式可供生产者和消费者使用。如果可能,您能否提供一个 GenearicRecord 方法的示例。
    • 与第一个链接相同的存储库。查找其他消费者示例的目录
    • 不过,很重要的一点。无论如何,您都需要重新编写代码才能获得更新的字段,因此如果您自己完全控制架构,那么实际上哪个选项应该没有太大区别。
    • 当我们使用带有 avro 序列化的架构注册表时,我们是否有任何其他选择,即架构更改时不需要任何代码更改。
    • 我们能否使用 avro 工具根据可用的最新架构创建类。
    猜你喜欢
    • 2018-01-26
    • 2013-02-27
    • 2020-10-05
    • 2021-07-18
    • 2021-10-20
    • 1970-01-01
    • 2021-03-07
    • 2019-09-24
    • 2018-08-11
    相关资源
    最近更新 更多