Confluent Schema Registry Avro Schema

时间:2016-07-21 18:31:13

标签: apache-kafka avro confluent

嘿我想将Confluent模式注册表与Avro Serializers一起使用:文档现在基本上说:不要对多个不同的topics使用相同的模式

任何人都可以向我解释原因吗? 我重新研究源代码,它基本上将模式存储在kafka主题中,如下所示(topicname,magicbytes,version-> key)(schema-> value)

因此我没有看到多次使用模式的问题需要冗余?

1 个答案:

答案 0 :(得分:0)

我认为你在文档中提到了这个评论:

  

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

首先,上面的评论者是正确的 - 这只是指旧的生产者API 0.8.2之前。强烈建议你使用新的制作人,因为它是一个更好的实现,并不依赖于整个核心jar,并且是将继续保持的客户端(没有'但是,特定的时间线还是旧的生产者,最终会被弃用,然后被删除。

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

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