2

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

谁能向我解释为什么?我重新搜索了源代码,它基本上将模式存储在 kafka 主题中,如下所示(主题名、魔术字节、版本->键)(模式->值)

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

4

1 回答 1

0

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

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

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

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

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

于 2016-07-23T20:38:42.650 回答