【问题标题】:Avro schema : is adding an enum value to existing schema backward compatible?Avro 模式:向现有模式添加枚举值是否向后兼容?
【发布时间】:2020-06-19 09:41:03
【问题描述】:

我的 Avro 架构中有一个状态枚举字段,其中当前可能的状态是

PENDING
APPROVED
REJECTED

我想在这个枚举“RESUBMIT”中再添加一个值。此更改是否向后兼容?

【问题讨论】:

    标签: apache-kafka avro


    【解决方案1】:

    不,不是。原因如下: 如果您正在使用这个新模式来向 Kafka 发送事件,那么所有客户端都将尝试反序列化该值。 当出现新类型的事件时,有两种情况:

    1. 具有新架构的客户端将成功反序列化
    2. 具有 old 架构的客户端将无法反序列化,因为它们的枚举中没有这样的值

    所以,不,这不向后兼容。

    更新: 您可以通过指定 枚举的默认值(在 Avro 版本 1.10.2+ 中可用)来避免反序列化失败

    【讨论】:

    • 这个答案不正确。下面的答案是正确的。从枚举中添加和删除符号的行为与添加或删除字段不同。 (其实恰恰相反。)
    • 此外,我认为默认值从 1.9+ 开始工作
    【解决方案2】:

    根据 https://docs.confluent.io/platform/current/schema-registry/avro.html

    • 向后兼容意味着使用新架构的消费者可以读取使用最后一个架构生成的数据
    • FORWARD 兼容性意味着使用新架构生成的数据可以由使用最后一个架构的消费者读取

    按照上面的定义/术语,变化是向后的 兼容,即您的所有消费者都需要先升级。但 不与 FORWARD 兼容,因为使用旧模式的消费者不能 反序列化这个。

    更正我之前的回答。

    https://avro.apache.org/docs/current/idl.html#:~:text=An%20Avro%20Enum%20supports%20optional,an%20incompatible%20symbol%20is%20read

    有一种方法可以以兼容的方式添加新的枚举值

    【讨论】:

    • 你能告诉我们更多关于“有一种方法可以以兼容的方式添加新的枚举值”吗?我尝试使用具有默认值的枚举,当我在使用 FULL_TRANSITIVE 兼容模式时添加新符号时它仍然不兼容
    【解决方案3】:

    我不这么认为,但欢迎您使用 Schema Registry API 来验证兼容性

    https://docs.confluent.io/current/schema-registry/develop/api.html#id1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多