修改Avro Record Name后别名失效的兼容问题咨询
修改Avro Record Name并保持向后兼容的可行性问题
背景与需求
使用Confluent Schema Registry,采用topicRecordName策略演化Avro Schema,需保持向后兼容且必须修改Record Name。修改原因是需要将两个Schema合并为一个事件,同时兼容旧数据。
旧Schema
{ "type": "record", "name": "OldSchema", "namespace": "com.example.kafkaschemaregistrydemo.event", "fields": [ { "name": "firstName", "type": ["null", "string"], "default": null } ] }
新Schema
{ "type": "record", "name": "NewSchema", "aliases": ["OldSchema"], "namespace": "com.example.kafkaschemaregistrydemo.event", "fields": [ { "name": "firstName", "type": ["null", "string"], "default": null } ] }
消费代码(Java)
@KafkaListener(topics = "TopicName", groupId = "test-group") public void consume(@Payload NewSchema event){ System.out.println("Supplier New Event"); System.out.println("Consumed message" + event.toString()); }
遇到的错误
Cannot convert from [com.example.kafkaschemaregistrydemo.events.OldSchema] to [com.example.kafkaschemaregistrydemo.event.NewSchema] for GenericMessage....
已尝试的方法
- 修改配置:
configProps.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, false); - 同时生成旧Schema与新Schema对应的Java类
- 尝试使用
SpecificRecord和GenericRecord作为消费参数类型 - 移除
@Payload注解 - 已通过Schema Registry的向后兼容性检查
问题
请问该需求是否可行?若不可行,有哪些替代方案?
内容的提问来源于stack exchange,提问作者Drum Beats
相关产品推荐
相关产品推荐

