【问题标题】:Kafka Avro Schema evolutionKafka Avro 模式演变
【发布时间】:2018-01-26 06:34:25
【问题描述】:

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

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

【问题讨论】:

  • 如果新字段不能为空且不能有默认值,那么您想对所有不包含该字段的旧记录做什么?您希望它们如何演变为新架构?
  • 是的。诚然。但我很好奇是否有办法在不创建新主题的情况下解决这种情况。

标签: apache-kafka avro


【解决方案1】:

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

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

在您的情况下,客户会如何表现?

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

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

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

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

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

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

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

我会选择选项 1。

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 2018-10-25
    • 2021-07-18
    • 2019-09-24
    • 2020-12-18
    • 2021-01-11
    • 2021-04-26
    • 1970-01-01
    • 2017-03-14
    相关资源
    最近更新 更多