Kafka Avro Schema演变

时间:2017-08-17 17:53:12

标签: apache-kafka avro

我正在尝试更多地了解我们用于Kafka主题的Avro架构,我对此相对较新。

我想知道是否有办法在特定情况下发展模式。我们使用一个不能为空的新字段或任何默认值来更新我们的模式,因为这些新字段是标识符。解决此问题的解决方法是创建新主题,但有没有更好的方法来发展现有模式?

1 个答案:

答案 0 :(得分:5)

主题中有四种可能的兼容性:   - Forward:等待旧版本架构的客户端可以读取新版本   - Backward:等待新版架构的客户端可以读取旧版本   - Both:以上两者   - None:以上都不是

考虑到某些生产者有时会产生旧数据和新数据,而消费者会有新数据或旧数据。

如何处理您的客户?

  • 添加字段始终向前兼容(旧客户只需删除新字段)
  • 只有在指定默认值
  • 时才向后兼容

此外,只有在您计划将数据转换为特定模式(例如,使用相应的POCO)时才会出现这种情况 - 如果您只是将其转换为json并进行自定义处理,则可以使用新的客户端进程同时进行两种模式

因此,我可以选择两种方式来讨论同一主题:

  • 您设置了默认值。你可能误解了默认值,它并不意味着会写一个默认值,但是(引用avro规范)
      

    此字段的默认值,用于读取缺少的实例   这个字段(可选)

例如,如果您之前有一个"名称"并且想要添加"姓氏",你可以 设置"姓"默认为" NC" (或空),就像你在数据库中所做的一样。

  • 您将兼容性默认值设置为none(或forward),以便您可以更新架构(默认情况下,comptibiliaty为backward)。在这种情况下,等待新架构的客户端无法处理旧数据。但是,如果您只处理传入数据(更改兼容性,更新所有生产者(以便只有新数据到达),然后等待新模式的客户端),它可以适合您的使用 - 请记住将兼容性设置为向后或兼容性想

我会选择选项1.

相关问题