【问题标题】:How to add an enum value to an AVRO schema in a FULL compatible way?如何以完全兼容的方式将枚举值添加到 AVRO 模式?
【发布时间】:2022-02-04 23:38:26
【问题描述】:

我在这样的 AVO 架构中有一个枚举:

{
    "type": "record",
    "name": "MySchema",
    "namespace": "com.company",
    "fields": [
        {
            "name": "color",
            "type": {
                "type": "enum",
                "name": "Color",
                "symbols": [
                    "UNKNOWN",
                    "GREEN",
                    "RED"
                ]
            },
            "default": "UNKNOWN"
        }
    ]
}

当使用 FULL(意味着 BACKWARD 和 FORWARD)兼容模式时,我应该如何向 enum 添加新符号?这不可能吗?

我读了Avro schema : is adding an enum value to existing schema backward compatible?,但没有帮助。

每当我尝试向符号添加新值时,即使我在枚举上有默认值,架构注册表中的兼容性检查也会失败。经过一番测试,似乎添加一个新值是向后兼容但不向前兼容。但是,由于我设置的默认值,我希望它也与 FORWARD 兼容。事实上,旧的阅读器模式应该能够读取新模式写入的值,并且在它不知道新符号时默认为“UNKNOWN”枚举值。

【问题讨论】:

    标签: java avro confluent-schema-registry


    【解决方案1】:

    目前 AVRO 中似乎存在一个错误,该错误会影响 1.9.0、1.10.0、1.9.1、1.9.2、1.11.0、1.10.1、1.10.2 等版本,直到修复为止。

    错误在于 avro 处理枚举默认值。

    根据具有旧模式的读取器端的documentation,我们应该能够反序列化包含由具有新模式的写入器端生成的枚举值的有效负载。由于读者不知道该值,因此应将其反序列化为默认值。

    此枚举的默认值,在解析期间使用,当读取器遇到未在读取器架构中定义的写入器符号时

    但事实并非如此,阅读器端的反序列化程序失败,但 org.apache.avro.AvroTypeException: No match for C 除外。

    我已经报告了错误here,并推送了一个复现测试here

    希望它能引起维护者的注意:)

    【讨论】:

      【解决方案2】:

      在枚举中添加新符号不完全兼容,甚至不兼容。

      见 ==> https://github.com/confluentinc/schema-registry/issues/880

      【讨论】:

      • 这个问题很老了(实际上早于 avro 1.9.0)。由于 avro 1.9.0 枚举具有默认值,请参阅 avro.apache.org/docs/1.9.0/spec.html#Enums。 “默认值:此枚举的默认值,在读取器遇到未在读取器架构中定义的写入器的符号时在解析期间使用(可选)”。所以在我看来,这似乎是一个错误。为什么我拒绝向具有默认值的枚举添加符号?该规范明确允许它并解释如何在消费者端处理未知符号。
      • 你是对的!我没注意那是个老问题!我同意它看起来像一个错误,也许应该尝试在 gitlhub 上创建一个问题
      • 我已经创建了问题issues.apache.org/jira/browse/AVRO-3313,并在github.com/idkw/avro/commit/… 处进行了重现错误的测试
      猜你喜欢
      • 2020-06-19
      • 2022-11-10
      • 1970-01-01
      • 2022-11-21
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多