java

wmomyfyw  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(297)

我想包括traceid和kafka消息负载的元数据。因此,我为kafka消息负载定义了以下类型。

public class KafkaMessage<T> {

    private String traceId;
    private Map<String, String> metaData = new HashMap<>();
    private T content;
}

我有两种狗和猫。我还创建了两种kafka消息负载类型。

public class Dog {
    private int name;
}

public class DogKafkaMessage extends KafkaMessage<Dog>{

}

public class Car {
    private int numberOfWheels;
}

public class CarKafkaMessage extends KafkaMessage<Car> {

}

我想在avro模式中表示这两种类型。有可能这样吗?如果是的话,请帮我解决这个问题。
我可以对kafka消息生产者和消费者使用json序列化器/反序列化器。但我很期待使用avro。
谢谢。

ar7v8xwq

ar7v8xwq1#

本来,avro不做泛型或继承。jacksonavro图书馆也许能帮上忙,但你可能会遇到奇怪的边缘案例。
相反,如果您不想只支持avro的jvm实现,您可以定义一个 Package 字节的模式,并且您必须将事件反序列化两次(外部消息和内部消息),在那里您甚至可以混合和匹配数据格式

record Event {
    string traceId;
    map<string> metadata;
    bytes content;
}

这与cloudevents规范的工作原理非常相似
https://github.com/cloudevents/spec/blob/v1.0.1/avro-format.md
https://github.com/cloudevents/spec/blob/v1.0.1/kafka-protocol-binding.md

相关问题