Enums 如何在Avro架构中别名枚举字段
为了向后兼容,我想将别名应用到我的avro模式中的演化枚举字段。 但是在向我的枚举添加别名之后,架构注册表仍然拒绝我的架构,因为它不兼容。有人能帮我看看我哪里做错了吗?我使用的是AVRO1.9.0 原始avro模式:Enums 如何在Avro架构中别名枚举字段,enums,avro,confluent-schema-registry,Enums,Avro,Confluent Schema Registry,为了向后兼容,我想将别名应用到我的avro模式中的演化枚举字段。 但是在向我的枚举添加别名之后,架构注册表仍然拒绝我的架构,因为它不兼容。有人能帮我看看我哪里做错了吗?我使用的是AVRO1.9.0 原始avro模式: { "namespace": "com.example.test", "type": "record", "name": "Employee&quo
{
"namespace": "com.example.test",
"type": "record",
"name": "Employee",
"doc" : "testing schema",
"fields": [
{
"name": "EmployeeId",
"type": "string",
"doc" : "Employee's Id"
},
{
"name": "Type",
"type": {
"type": "enum",
"name": "EmployeeType",
"symbols": ["OFFICER", "MANAGER", "DIRECTOR"]
}
}
]
}
我所做的是改变模式的名称空间。虽然架构的内容保持不变,但嵌入员工架构中的枚举是使用新名称空间com.example.test.newnamespace
隐式生成的。这种变化导致我的进化模式向后不兼容
我尝试使用新名称空间将别名添加到演进的枚举中:
{
"namespace": "com.example.test.newnamespace",
"type": "record",
"name": "Employee",
"doc" : "testing schema",
"fields": [
{
"name": "EmployeeId",
"type": "string",
"doc" : "Employee's Id"
},
{
"name": "Type",
"type": {
"type": "enum",
"name": "EmployeeType",
"aliases": ["com.example.test.EmployeeType"],
"symbols": ["OFFICER", "MANAGER", "DIRECTOR"]
}
}
]
}
但是,当我使用模式注册表的API检查演化模式时,注册表返回is compatible=false
如果我显式地将枚举的完整限定名设置为与旧名称空间“name”:“com.example.test.EmployeeType”
,则演化模式是兼容的
我哪里做错了?我看到Avro规范确实声明枚举字段支持别名:
列举
枚举使用类型名“enum”,并支持以下属性:
- name:提供枚举名称的JSON字符串(必需)
- 名称空间,一个限定名称的JSON字符串李>
- 别名:字符串的JSON数组,为该枚举提供备用名称(可选)
我想我也看到了同样的情况,这看起来像是一个错误,在别名应用的方式完全兼容。看起来别名在读写器之间是单向应用的,它们需要反向应用。请参见第1786行的Schema.java#applyalias。很显然,这就是它的工作原理,别名向后兼容,但向前不兼容。我想我也看到了同样的情况,这看起来像是别名完全兼容的应用方式中的一个bug。看起来别名在读写器之间是单向应用的,它们需要反向应用。参见第1786行附近的Schema.java#applyalias。显然,这就是它的工作原理,别名向后兼容,但向前不兼容。