当前位置: 首页 > 知识库问答 >
问题:

如何使用Kafka模式管理和Avro来破坏更改

米飞龙
2023-03-14

使用avro的Kafka模式管理为我们提供了向后兼容性的灵活性,但我们如何处理方案中的突破性更改?

假设生产者A向消费者C发布消息M

假设消息M的方案发生了重大变化(例如名称字段现在被拆分为名字和姓氏),我们有了新方案M-new

现在我们正在部署producer A-New和Consumer C-New

问题是,在我们的部署过程完成之前,我们可以让生产者发布一条新消息M-new,消费者C(旧的那个)将接收M-new,我们可能会因此丢失消息。

因此,唯一的方法是同步部署新的生产者和消费者,这增加了大量的开销

有什么建议吗?

共有2个答案

张嘉佑
2023-03-14

e、 g name字段现在被拆分为first_name和last_name

“向后兼容”模式的Avro定义不允许您添加这些新字段,1)保留旧名称字段2)为新字段添加默认值-https://docs.confluent.io/current/schema-registry/avro.html

如果消费者首先升级了他们的模式,他们会看到旧名称字段,继续由旧生产者发送,并解释新字段的默认值,直到生产者升级并开始发送新字段

如果生产商先升级,那么消费者将永远看不到新字段,因此生产商仍应发送名称字段,或者选择发送一些垃圾值,这些垃圾值将开始故意破坏使用者(例如,使字段开始为null,但从不实际发送null,然后开始发送null,而使用者认为它不能为null)

无论哪种情况,我都觉得您的记录处理逻辑必须检测哪些字段可用,而不是null或其默认值。

但是,将其与JSON或任何普通字符串(如CSV)进行比较,你不能保证哪些字段应该在那里,如果它们是可空的,或者它们是什么类型(日期是字符串还是长?),因此你不能保证你的客户端会在内部将消息映射到哪些对象进行处理...我发现Avro比兼容性规则更有优势

就我个人而言,我发现在注册表上执行FULL_TRANSITIVE兼容性是最好的,当你在你的Kafka用户之间几乎没有通信时

谭研
2023-03-14

一个简单的方法是对你的话题有一个很长的保留期。然后你就为这些突破性的变化创建一个新的主题。所有消费者都可以在保留期内转到新主题,而不会丢失邮件。

 类似资料:
  • 如果Kafka主题的Avro模式被用作另一个模式的参考,那么更新该模式的正确方法是什么? 例如,假设我们有两个Kafka主题:一个使用Avro模式用户,另一个使用UserAction。 然后我想给用户添加一个额外的字段——一个“姓氏”,所以它看起来像这样:,空以使此更改兼容。要做到这一点,我可以更改Avro模式文件,使用Maven模式插件重新生成POJO,然后如果我将使用KafkaTemplate

  • 我用Flink的table API创建了一个表。 当运行SQL以查看记录时,我得到: 我知道有一些坏的avro记录被推送到Kafka主题中。在JSON格式中,有一个选项可以通过设置来跳过/过滤这些记录。当从合流avro格式读取时,我们可以跳过这些记录吗? 这并不理想,但不幸的是,尽管有一个模式注册表,但我无法控制要推送到Kafka的内容。

  • 我这么说是因为来自avro的POJO一代不是那么直截了当的。在此基础上,它需要maven插件和一个.avsc文件。 例如,我在我的Kafka制作人上创建了一个POJO,名为User: 我连载它,并发送到我的用户主题在Kafka。然后我有一个消费者,它本身有一个POJO用户,并反序列化消息。是空间问题吗?这样序列化和反序列化不是也更快吗?更不用说维护模式注册表的开销了。

  • 我收到Kafka主题中的二进制Avro文件,我必须对它们进行反序列化。在Kafka收到的消息中,我可以在每条消息的开头看到一个模式。我知道不嵌入模式并将其与实际的Avro文件分离是一种更好的做法,但我无法控制生产者,也无法更改。 我的代码在Apache Storm上运行。首先,我创建一个读卡器: 然后,我尝试反序列化消息,但不声明架构: 但当消息到达时,我会收到一个错误: 我看到的所有答案都是关于

  • 我正试图了解更多关于我们在Kafka主题中使用的Avro模式的信息,我对这一点相对来说比较陌生。 我想知道是否有一种方法可以在特定情况下发展模式。我们用一个不能为null的新字段或任何默认值来更新模式,因为这些新字段是标识符。解决这个问题的方法是创建新主题,但是有没有更好的方法来改进现有模式?

  • 我是AWS Glue的新手,很难完全理解AWS文档,但我正在努力解决以下用例: 我们有一个包含许多Avro文件的s3存储桶。我们决定使用Avro,因为它具有对数据架构更改的广泛支持,允许将新字段毫无问题地应用于旧数据。 有了AWS Glue,我知道每当模式发生变化时,爬虫就会创建一个新表。当我们的模式发生变化时,这导致爬虫程序按预期创建了许多新表,但并不像我们期望的那样。。。 最后,我们希望爬行器