不断发展的 Avro 架构(其中记录名称发生更改)和使用别名不起作用

问题描述 投票:0回答:1

所以我有一个 avro 模式,我想发展它并使用 topicRecordName 策略。我正在使用融合模式注册表。我想让它向后兼容,并且有必要更改记录名称。 旧模式

{
  "type": "record",
  "name": "OldSchema",
  "namespace": "com.example.kafkaschemaregistrydemo.event",
  "fields": [
    {
      "name": "firstName",
      "type": ["null", "string"],
      "default": null
    }
  ]
}

新架构

{
  "type": "record",
  "name": "NewSchema",
  "aliases": ["OldSchema"],
  "namespace": "com.example.kafkaschemaregistrydemo.event",
  "fields": [
    {
      "name": "firstName",
      "type": ["null", "string"],
      "default": null
    }
  ]
}```
I am using `KafkaAvroDeserialiser` in java to deserialize.

我处理消息的方式如下

@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....

我想要更改记录名称的原因是因为我有两个模式,我想将它们合并为一个事件,同时保持向后兼容性。

我尝试过的一些事情 我认为拥有别名应该足够了,特别是当其他字段的别名工作正常但不适用于 RecordName 时。

  1. 改变
    configProps.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, false);
  2. 旧模式也可以与新模式一起生成
  3. 尝试过
    SpecificRecord
    GenericRecord
  4. 尝试过没有
    @Payload
  5. 当我检查向后兼容性时,它通过了。 这是否可能?如果不可能我有什么选择?
java spring-kafka avro confluent-schema-registry
1个回答
0
投票

当检查两个模式之间的兼容性并且名称不匹配时,则会检查别名。但是,它们会与编写器模式记录的“完整”名称进行比较。尝试将别名更改为“com.example.kafkaschemaregistrydemo.event.OldSchema”,看看是否有效。

© www.soinside.com 2019 - 2024. All rights reserved.