2017-08-17 107 views
1

我想了解更多关于我们用于我们的卡夫卡话题的avro架构,我对此相对较新。我想知道是否有办法在特定情况下演变架构。我们用一个新字段更新我们的模式不能为空或任何默认值,因为这些标识符都是这种类型。为此我们所做的工作是创建新的主题,但有没有更好的方法来演进现有的模式。谢谢。卡夫卡Avro架构演变

+1

去。如果新字段不能为空,不能有一个默认值,你会想与所有不包含旧的记录做那么什么这个领域?你想让他们演变成新的模式吗? –

+0

是的,但是我很好奇,是否有工作来解决这个问题而不创建新的主题。 –

回答

1

有主题的四个可能的兼容性: - Forward:等待着老版本的架构的客户端可以读取新版本 - Backward:这等待模式的新版本的客户端可以读取旧版本 - Both:以上 都 - None:上面这些都不是

考虑,有一些次,其中一些生产商将生产新老数据,以及消费者将只准新的或旧的数据。

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

  • 添加一个字段总是向前兼容(老客户刚落,新领域)
  • 只有当你指定一个默认值

而且它是向下兼容的,这是唯一真正的,如果你正在计划将数据转换为特定模式(例如通过相应的POCO) - 如果您只是将其转换为json并进行自定义处理,则可以让新客户端处理两种模式。

所以我买两个possibe方式来wrte到同一个主题:

  • 您设置的默认值。你可能会误解默认值,读书缺乏 这个字段(可选)实例

    时,这并不意味着默认值将被写入,但(报价Avro的规格)

    此字段的默认值,使用

例如,如果你以前有“名”,并要添加“姓”,你可以 集“姓”默认为“NC”(或空),你可能已经在做一个数据库。

  • 您可以设置您的兼容性默认为none(或forward),这样就可以更新您的模式(因为默认情况下,comptibiliaty是backward)。在这种情况下,等待新模式的客户端将无法处理旧数据。但是,如果您只处理传入数据(更改兼容性,更新所有生产者(以便只有新数据将到达),那么您的客户端正在等待新模式 - 记住要将兼容性设置回落或兼容性确实适合您的使用要

我会选择1