0

我想为我的 Kafka 消息有效负载包含 traceId 和元数据。所以我为 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。

谢谢。

4

1 回答 1

0

Avro 本身不做泛型或继承。Jackson Avro 库可能会对此有所帮助,但您可能会遇到奇怪的边缘情况。

相反,如果您想支持的不仅仅是 Avro 的 JVM 实现,您可以定义一个包装字节的模式,并且您必须对事件进行两次反序列化(外部和内部消息),您甚至可以混合和匹配数据格式

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

这与 CloudEvents 规范的工作方式非常相似

于 2021-04-21T13:07:24.873 回答