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 是不是存在任何已知的向后兼容性问题?