嘿,我想将 Confluent 模式注册表与 Avro 序列化程序一起使用:文档现在基本上说:不要对多个不同的主题使用相同的模式
谁能向我解释为什么?我重新搜索了源代码,它基本上将模式存储在 kafka 主题中,如下所示(主题名、魔术字节、版本->键)(模式->值)
因此,我没有看到多次使用模式的问题期望冗余?
嘿,我想将 Confluent 模式注册表与 Avro 序列化程序一起使用:文档现在基本上说:不要对多个不同的主题使用相同的模式
谁能向我解释为什么?我重新搜索了源代码,它基本上将模式存储在 kafka 主题中,如下所示(主题名、魔术字节、版本->键)(模式->值)
因此,我没有看到多次使用模式的问题期望冗余?
我认为您指的是文档中的此评论:
我们建议用户在
org.apache.kafka.clients.producer.KafkaProducer
. 如果您使用的 Kafka 版本早于 0.8.2.0,您可以KafkaAvroEncoder
在kafka.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 可以看到它不知道如何处理的数据,因为它不是它支持的模式。
所以简短的版本是因为如果您还使用相同的模式,则必须与旧生产者共享主题,您最终会耦合两个应用程序和它们必须支持的模式。您可以跨主题使用相同的模式,但我们建议不要这样做,因为它会耦合您的应用程序(以及它们的开发、开发它们的团队等)。