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



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

{
"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架构:向现有架构添加枚举值是否向后兼容?但这无济于事。

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

目前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定义中移动default(。希望这能帮助

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

在枚举中添加新符号是不兼容FULL的,甚至是不兼容FORWARD的。

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

最新更新