我有一个用例,其中有一个JSON,我想生成模式并从JSON中记录并发布记录。我已经配置了值序列化程序,并且架构设置是向后兼容的。
第一个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生成的模式,而拒绝第三个JSON?虽然我没有用于删除字段的任何默认密钥?是Schema Registry始终接受第一版吗?(第2个模式超过第1个)
模式注册表中的模式
版本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" }
让我们看一下向后兼容性规则... https://docs.confluent.io/current/schema-registry/avro.html#compatibility-types
首先,默认值不是可传递的,因此版本3仅查看版本2。
向后规则指出您可以删除字段或添加可选字段(默认情况下)。我假设您的模式生成器工具不知道如何使用可选选项,因此只允许您删除而不添加。
在版本1和版本2之间,您已经删除了有效的名称字段。
在版本2和传入版本3之间,它认为您正在尝试发布一个删除价格的新架构(可以这样做),但是添加了必填名称字段,不允许使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句