Schema Registry 中的向后兼容性问题和不确定性

Posted

技术标签:

【中文标题】Schema Registry 中的向后兼容性问题和不确定性【英文标题】:Backward Comaptibility issue and uncertainity in Schema Registry 【发布时间】:2020-04-24 20:24:09 【问题描述】:

我有一个用例,我有一个 JSON,我想从 JSON 中生成模式和记录并发布记录。 我已经配置了值序列化器,并且 Schema 设置是向后兼容的。

第一个 JSON

字符串 json = "\n" +

     "    \"id\": 1,\n" +

     "    \"name\": \"Headphones\",\n" +

     "    \"price\": 1250.0,\n" +

     "    \"tags\": [\"home\", \"green\"]\n" +

     "\n"
     ;

已注册版本 1 架构。

在 avro 控制台使用者中收到消息。

第二个 JSON。

字符串 json = "\n" +

    "    \"id\": 1,\n" +

    "    \"price\": 1250.0,\n" +
    "    \"tags\": [\"home\", \"green\"]\n" +
    "\n"
    ;

已成功注册架构。 已发送消息。

现在尝试发送 JSON 1 发送成功

架构 3:

字符串 json = "\n" +

    "    \"id\": 1,\n" +
    "    \"name\": \"Headphones\",\n" +

    "    \"tags\": [\"home\", \"green\"]\n" +
    "\n"
    ;

在这种情况下出现错误。 引起:io.confluent.kafka.schemaregistry.client.rest.exceptions.RestClientException:正在注册的模式与早期模式不兼容;错误代码:409

从第二个 JSON 生成的架构是如何注册的? 第三个被拒绝了?虽然我没有任何默认键 删除字段?是不是 Schema Registry 总是接受第一个 进化? (第二个架构超过第一个)

架构注册表中的架构

版本 1 架构

“字段”:[



  "doc": "Type inferred from '1'",

  "name": "id",

  "type": "int"

,



  "doc": "Type inferred from '\"Headphones\"'",

  "name": "name",

  "type": "string"

,



  "doc": "Type inferred from '1250.0'",

  "name": "price",

  "type": "double"

,



  "doc": "Type inferred from '[\"home\",\"green\"]'",

  "name": "tags",

  "type": 

    "items": "string",

    "type": "array"

  


],
"name": "myschema",
"type": "record"   

版本 2:

“字段”:[



  "doc": "Type inferred from '1'",

  "name": "id",

  "type": "int"

,



  "doc": "Type inferred from '1250.0'",

  "name": "price",

  "type": "double"

,



  "doc": "Type inferred from '[\"home\",\"green\"]'",

  "name": "tags",

  "type": 

    "items": "string",

    "type": "array"

  


],
"name": "myschema",
"type": "record"   

【问题讨论】:

请显示已添加到注册表的架构 @cricket_007 我已经更新了正文,请在正文中找到架构。 【参考方案1】:

让我们回顾一下向后兼容性规则...https://docs.confluent.io/current/schema-registry/avro.html#compatibility-types

首先,默认值不具有传递性,因此版本 3 只会查看版本 2。

向后规则规定您可以删除字段或添加可选字段(具有默认值的字段)。我假设您的模式生成器工具不知道如何使用可选项,因此您只能删除,不能添加。

在版本 1 和 2 之间,您已删除有效的名称字段。

在版本 2 和传入的 3 之间,它认为您正在尝试发布一个删除价格的新架构(这没关系),但添加了一个必需的名称字段,这是不允许的。

【讨论】:

以上是关于Schema Registry 中的向后兼容性问题和不确定性的主要内容,如果未能解决你的问题,请参考以下文章

升级 Newtonsoft.JSON 是不是存在任何已知的向后兼容性问题?

为新指令集扩展优化编译的代码的向后兼容性

Android Studio 上的向后兼容性 (AppCompat)

使用 Core Data 时的向后兼容性

更改 Spring Boot 外部化配置时的向后兼容性

OSX 应用程序的向后兼容性