2

我正在学习 Kafka,对我来说,使用 Avro 来使用带有 Schema 的 Kafka 主题是有意义的。

但是当谈到架构定义的放置位置时,我遗漏了一些东西:

  • 如果我不使用模式注册表,但在我的项目中有 Avro 文件,我可以生成 Java 类并在发送消息时将其用作抽象层。这非常好,但现在我在多个项目中有这个文件的多个版本。我可以想象让它们保持同步会受到伤害。

  • 如果我使用模式注册表,上面的问题就解决了。但是现在我看不到在生成消息时从模式定义中获利的方法:我需要手动生成 GenericRecord 对象以发送到 Kafka,而且我无法查看我生成的消息是否与模式匹配。

  • 我也看不到使用模式来反序列化消费者端的消息的方法。

在序列化和反序列化消息时,有什么方法可以从模式定义中获利?

我找不到任何在两端都这样做的例子,特别是使用模式注册表。

4

1 回答 1

3

没错,您必须使用模式注册表来避免模式版本控制问题。

我无法查看我生成的消息是否与架构匹配

为什么 ?您可以轻松地编写一些单元测试来在您的生产者端验证您的 GenericRecord。

否则,我建议您使用

KafkaAvroSerializerKafkaAvroDeserializer分别位于生产者和消费者端。

两者都通过 SchemaRegistryClient 实现连接到模式注册表:CachedSchemaRegistryClientMockSchemaRegistryClient(专用于您的单元测试)

  • 序列化器/反序列化器可以在这里找到: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>
于 2017-06-29T12:56:27.850 回答