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

sin*_*ge3 4 java avro confluent-schema-registry

我在 AVRO 模式中有一个枚举,如下所示:

{
    "type": "record",
    "name": "MySchema",
    "namespace": "com.company",
    "fields": [
        {
            "name": "color",
            "type": {
                "type": "enum",
                "name": "Color",
                "symbols": [
                    "UNKNOWN",
                    "GREEN",
                    "RED"
                ]
            },
            "default": "UNKNOWN"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

我读到Avro schema :向现有架构添加枚举值是否向后兼容?但这没有帮助。

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

sin*_*ge3 6

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

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

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

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

然而,事实并非如此,读取器端的解串器失败并出现异常org.apache.avro.AvroTypeException: No match for C

我已经在这里报告了这个错误,并在这里进行了重现测试

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

  • 需要在“type”定义中添加默认值,这就是它在您的示例中不起作用的原因。 (3认同)