Kafka Avro Schema 演进

Kafka Avro Schema evolution

我正在尝试更多地了解我们用于 Kafka 主题的 Avro 模式,我对此比较陌生。

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

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

考虑到有些时候一些生产者会产生新旧数据,而消费者会排除新数据或旧数据。

在您的案例中,客户会如何表现?

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

此外,只有当您计划将数据转换为特定模式(例如使用相应的 POCO)时,这才是正确的 - 如果您只是将其转换为 json 并进行自定义处理,您可以一个新的客户端处理两个模式。

所以我有两种可能的方式来写同一个主题:

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

    A default value for this field, used when reading instances that lack this field (optional)

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

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

我会选择选项 1。