【问题标题】:How to profit from the schema definition to serialize/deserialize the message when using Avro + Schema Registry?使用 Avro + Schema Registry 时,如何从模式定义中获益来序列化/反序列化消息?
【发布时间】:2017-12-02 08:34:55
【问题描述】:
我正在学习 Kafka,对我来说,使用 Avro 来创建一个带有 Schema 的 Kafka 主题是有意义的。
但是当谈到架构定义的放置位置时,我遗漏了一些东西:
如果我不使用模式注册表,但我的项目中有 Avro 文件,我可以生成 Java 类并在发送消息时将其用作抽象层。这非常好,但现在我在多个项目中有这个文件的多个版本。我可以想象让它们保持同步会很痛苦。
如果我使用模式注册表,上面的问题就解决了。但是现在我看不到在生成消息时从模式定义中获利的方法:我需要手动生成 GenericRecord 对象以发送到 Kafka,而且我无法查看我生成的消息是否与模式匹配。
我也看不到使用模式来反序列化消费者端的消息。
在序列化和反序列化消息时,有什么方法可以从架构定义中获利?
我找不到任何在两端都这样做的示例,特别是使用模式注册表。
【问题讨论】:
标签:
apache-kafka
avro
confluent-platform
confluent-schema-registry
【解决方案1】:
没错,您必须使用架构注册表来避免架构版本控制问题。
我无法查看我生成的消息是否与架构匹配
为什么?您可以轻松地编写一些单元测试来在您的生产者端验证您的 GenericRecord。
否则,我建议您使用
KafkaAvroSerializer 和 KafkaAvroDeserializer 分别位于生产者和消费者端。
两者都通过 SchemaRegistryClient 实现连接到模式注册表:CachedSchemaRegistryClient 或 MockSchemaRegistryClient(专用于您的单元测试)
- 序列化器/反序列化器可以在这里找到:io.confluent:kafka-avro-serializer:3.2.0
- SchemaRegistryClient 的实现可以在这里找到:io.confluent:kafka-schema-registry-client:3.2.0
如果你使用 maven:
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-avro-serializer</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-schema-registry-client</artifactId>
<version>3.2.0</version>
</dependency>