汇合模式注册表avro模式

cig3rfwq  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(306)

嘿,我想使用融合模式注册表与avro序列化程序:现在的文档基本上说:不要对多个不同的主题使用相同的模式
有人能解释一下为什么吗?我重新搜索源代码,它基本上将模式存储在Kafka主题中,如下所示(topicname,magicbytes,version->key)(模式->值)
因此,除了冗余之外,我看不到多次使用模式的问题?

bhmjp9jg

bhmjp9jg1#

我认为你指的是文件中的这一评论:
我们建议用户在中使用新的生产者 org.apache.kafka.clients.producer.KafkaProducer . 如果您使用的Kafka版本早于0.8.2.0,则可以插入 KafkaAvroEncoder 变成了一个老制片人 kafka.javaapi.producer . 但是,也会有一些局限性。你只能用 KafkaAvroEncoder 用于序列化消息的值,并且只发送类型为avro record的值。该值的avro模式将在subject下注册 recordName-value ,在哪里 recordName 是avro记录的名称。因此,同一个avro记录类型不应在多个主题中使用。
首先,上面的注解是正确的——这只引用了旧的producer api pre-0.8.2。强烈建议您无论如何使用新的producer,因为它是一个更好的实现,不依赖于整个核心jar,并且是将继续维护的客户机(目前还没有具体的时间表,但是旧的producer最终将被弃用,然后被删除)。
但是,如果您使用的是旧的生产者,则只有在两个主题的模式可能分别发展时才需要此限制。假设您确实编写了两个应用程序,它们编写了不同的主题,但是使用相同的avro记录类型,我们称之为 record . 现在两个应用程序都将在主题下注册/查找它 record-value 得到分配 version=1 . 只要模式不变,这一切都是好的。但是假设应用程序现在需要添加一个字段。当它这样做时,模式将在subject下注册 record-value 得到分配 version=2 . 这对于应用程序a来说没问题,但应用程序b要么没有升级以处理此模式,要么更糟,该模式甚至对应用程序b无效。但是,您失去了schema registry通常为您提供的保护--现在其他一些应用程序可以将该格式的数据发布到应用程序b使用的主题中(看起来没问题,因为 record-value 已注册该架构)。现在应用程序b可以看到它不知道如何处理的数据,因为它不支持模式。
因此,简短的版本是,因为对于旧的生产者,如果您也使用相同的模式,则必须共享主题,因此最终会耦合两个应用程序以及它们必须支持的模式。您可以跨主题使用相同的模式,但我们建议不要这样做,因为它会耦合您的应用程序(及其开发、开发团队等)。

相关问题