Spring / Avro - 使用融合模式注册表
Spring / Avro - using confluent schema registry
我正在尝试使用 Confluent 模式注册表,它按照我在 Github (https://github.com/gAmUssA/springboot-kafka-avro) 中找到的一些示例为我工作。
当消费者和生产者与模型共享相同的名称空间时。
当消费者处于具有不同命名空间但相同 class(名称和属性明智)的不同项目时,它不起作用。
Confluent Avro 反序列化器可以使用正确的值反序列化为 GenericData$Record class,但无法将其转换为实际对象。
我正在尝试这个:
@Data
@AllArgsConstructor
public class User {
String name;
int age;
}
...
@KafkaListener(topics = "users", groupId = "group_id")
public void consume(ConsumerRecord<String, User> record) {
log.info(String.format("Consumed message -> %s", record.value().getName()));
}
以上代码在转换问题上失败。
当我将 specific.avro.reader=true 添加到道具时,它也失败了。
这不是架构注册表的全部目的吗,成为一个中央仓库,以便数据可以通过不同项目甚至不同语言的架构反序列化(python,java,.net,等等..)?
我错过了什么?
问题是您的用户 class 不是 Avro class。
您应该使用 Avro Maven / Gradle 插件来生成您的 classes 而不是使用 Lombok,并且命名空间和完整模式确实需要对齐。我发现最好的管理方法是开发和发布与实际的 kafka 代码完全分开的模型
我正在尝试使用 Confluent 模式注册表,它按照我在 Github (https://github.com/gAmUssA/springboot-kafka-avro) 中找到的一些示例为我工作。
当消费者和生产者与模型共享相同的名称空间时。
当消费者处于具有不同命名空间但相同 class(名称和属性明智)的不同项目时,它不起作用。
Confluent Avro 反序列化器可以使用正确的值反序列化为 GenericData$Record class,但无法将其转换为实际对象。
我正在尝试这个:
@Data
@AllArgsConstructor
public class User {
String name;
int age;
}
...
@KafkaListener(topics = "users", groupId = "group_id")
public void consume(ConsumerRecord<String, User> record) {
log.info(String.format("Consumed message -> %s", record.value().getName()));
}
以上代码在转换问题上失败。
当我将 specific.avro.reader=true 添加到道具时,它也失败了。
这不是架构注册表的全部目的吗,成为一个中央仓库,以便数据可以通过不同项目甚至不同语言的架构反序列化(python,java,.net,等等..)?
我错过了什么?
问题是您的用户 class 不是 Avro class。
您应该使用 Avro Maven / Gradle 插件来生成您的 classes 而不是使用 Lombok,并且命名空间和完整模式确实需要对齐。我发现最好的管理方法是开发和发布与实际的 kafka 代码完全分开的模型