【问题标题】:Confluent Schema Registry Avro SchemaConfluent Schema Registry Avro Schema
【发布时间】:2016-07-24 04:38:42
【问题描述】:

嘿,我想将 Confluent 架构注册表与 Avro 序列化程序一起使用:文档现在基本上说:不要对多个不同的 topics 使用相同的架构@

谁能给我解释一下为什么? 我重新搜索了源代码,它基本上将模式存储在 kafka 主题中,如下所示 (topicname,magicbytes,version->key) (schema->value)

因此,我没有看到多次使用架构的问题期望冗余?

【问题讨论】:

  • 据我了解文档仅适用于 kafka 但是您只能使用 KafkaAvroEncoder 序列化消息的值(不是键),并且只能发送 Avro 记录类型的值。因此,该值的 Avro 模式将在主题 recordName-value 下注册,其中 recordName 是 Avro 记录的名称。
  • 你能解释一下为什么你得出结论“现在的文档基本上说:不要对多个不同的主题使用相同的模式”?我在链接的文档中没有看到此建议。

标签: apache-kafka avro confluent-platform


【解决方案1】:

我认为您指的是文档中的此评论:

我们建议用户使用org.apache.kafka.clients.producer.KafkaProducer 中的新生产者。如果您使用的 Kafka 版本早于 0.8.2.0,您可以将 KafkaAvroEncoder 插入 kafka.javaapi.producer 中的旧生产者。但是,会有一些限制。您只能使用KafkaAvroEncoder 来序列化消息的值,并且只能发送 Avro 记录类型的值。该值的 Avro 模式将在主题 recordName-value 下注册,其中 recordName 是 Avro 记录的名称。因此,不应在多个主题中使用相同的 Avro 记录类型。

首先,上面的评论是正确的——这只是指旧的生产者 API pre-0.8.2。强烈建议您无论如何都使用新的生产者,因为它是一个更好的实现,不依赖于整个核心 jar,并且是将继续维护的客户端(目前还没有具体的时间表,但是旧的生产者最终将被弃用,然后被删除)。

但是,如果您使用的是旧生产者,则仅当两个主题的架构可能分开发展时才需要此限制。假设您确实编写了两个写入不同主题的应用程序,但使用相同的 Avro 记录类型,我们称之为record。现在两个应用程序都将注册它/在主题 record-value 下查找它并获得分配 version=1。只要架构没有改变,这一切都很好。但是假设应用程序 A 现在需​​要添加一个字段。当它这样做时,模式将在主题record-value 下注册并被分配version=2。这对应用程序 A 来说很好,但应用程序 B 尚未升级以处理此架构,或者更糟糕的是,架构甚至对应用程序 B 都不是有效。但是,您失去了架构注册表的保护通常会给你——现在其他一些应用程序可以将该格式的数据发布到应用程序 B 使用的主题中(看起来没问题,因为record-value 已注册该模式)。现在应用程序 B 可以看到它不知道如何处理的数据,因为它不是它支持的模式。

所以简短的版本是因为如果您还使用相同的架构,则必须与旧的生产者共享主题,您最终会耦合两个应用程序和它们必须支持的架构。您可以跨主题使用相同的架构,但我们建议不要这样做,因为它会耦合您的应用程序(以及它们的开发、开发它们的团队等)。

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 2022-12-27
    • 2021-10-04
    • 1970-01-01
    • 2023-01-11
    • 2019-05-01
    • 2018-09-27
    • 2019-07-21
    相关资源
    最近更新 更多