如何以完全兼容的方式将枚举值添加到 AVRO 模式?

How to add an enum value to an AVRO schema in a FULL compatible way?

我在这样的 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)兼容模式时,我应该如何向枚举添加新符号?这不可能吗?

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

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

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

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

目前 AVRO 中似乎存在一个错误,该错误会影响版本 1.9.0、1.10.0、1.9.1、1.9.2、1.11.0、1.10.1、1.10.2 并进一步影响到它已修复。

该错误存在于枚举默认值的 avro 处理中。

根据 reader 端的 documentation 使用旧模式,我们应该能够反序列化包含由具有新模式的编写器端生成的枚举值的有效负载。由于该值对于 reader 是未知的,因此应该将其反序列化为默认值。

A default value for this enumeration, used during resolution when the reader encounters a symbol from the writer that isn't defined in the reader's schema

然而,事实并非如此,reader 端的反序列化器失败并出现异常 org.apache.avro.AvroTypeException: No match for C

我已报告错误 here, and a pushed a reproduction test here

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