Enums 如何在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

为了向后兼容,我想将别名应用到我的avro模式中的演化枚举字段。 但是在向我的枚举添加别名之后,架构注册表仍然拒绝我的架构,因为它不兼容。有人能帮我看看我哪里做错了吗?我使用的是AVRO1.9.0

原始avro模式:

{
    "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。显然,这就是它的工作原理,别名向后兼容,但向前不兼容。