Kafka Avro Schema演变

Ach*_*eus 1 avro apache-kafka

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

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

Tre*_*iac 5

主题中有四种可能的兼容性: - Forward:等待旧版本模式Backward的客户端可以读取新版本 - :等待新版本模式的客户端可以读取旧版本 - Both:上述两者 - None:没有以上

考虑到有些生产者会产生旧数据和新数据,而消费者除了新数据或旧数据之外.

在你的情况下如何表现客户?

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

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

因此,我有两种可能的方式来讨论同一主题:

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

    读取缺少此字段的实例时使用的此字段的默认值(可选)

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

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

我会选择1.