好的,考虑到我已经问过一个相关的问题,我有点沮丧:
Why kafka-avro-console-producer doesn't honour the default value for the field?
如果生产者使用旧模式而不使用新字段f2,则使用新模式的消费者应接受该字段的默认值,但这在kafka-avro-console-consumer情况下不明显:
$ kafka-avro-console-producer --broker-list localhost:9092 --topic test-avro --property schema.registry.url=http://localhost:8081 --property value.schema='{"type":"record","name":"myrecord1","fields":[{"name":"f1","type":"string"}]}'
{"f1": "value3"}
$ kafka-avro-console-consumer --bootstrap-server localhost:9092 --topic test-avro --property schema.registry.url=http://localhost:8081 --property value.schema='{"type":"record","name":"myrecord1","fields":[{"name":"f1","type":"string"},{"name": "f2", "type": "int", "default": 0}]}'
{"f1":"value3"}
我的意思是,好的,它确实不会引发异常并且不会由于缺少f2字段而终止,这是好的,它显示了收到的实际消息,但应该显示而不是显示该消息的表示形式。消息是否根据其使用的模式?
这是架构的两个版本:
curl http://localhost:8081/subjects/test-avro-value/versions/1
{"subject":"test-avro-value","version":1,"id":5,"schema":"{\"type\":\"record\",\"name\":\"myrecord1\",\"fields\":[{\"name\":\"f1\",\"type\":\"string\"}]}"}
curl http://localhost:8081/subjects/test-avro-value/versions/2
{"subject":"test-avro-value","version":2,"id":6,"schema":"{\"type\":\"record\",\"name\":\"myrecord1\",\"fields\":[{\"name\":\"f1\",\"type\":\"string\"},{\"name\":\"f2\",\"type\":\"int\",\"default\":0}]}"}
那么,这是否意味着不能用kafka-avro-console-consumer测试这种情况?
答案 0 :(得分:2)
您的生产者已经注册了您在注册表中指定的value.schema
。
由于使用嵌入在有效负载字节数组中的架构ID直接从注册表中检索它,因此无法使用Confluent的使用者应用程序为使用者明确定义架构。