Avro Schema Registry 的价值是啥?

Posted

技术标签:

【中文标题】Avro Schema Registry 的价值是啥?【英文标题】:What is the value of an Avro Schema Registry?Avro Schema Registry 的价值是什么? 【发布时间】:2019-09-07 21:13:09 【问题描述】:

我有许多微服务在 Kafka 中读取/写入 Avro 消息。

架构很棒。阿弗罗很棒。 但是真的需要模式注册表吗?它有助于集中模式,是的,但是微服务真的需要查询注册表吗?我不这么认为。

每个微服务都有一个架构副本user.avsc,以及一个 Avro 生成的 POJO:User extends SpecificRecord。我想要每个 Schema 的 POJO,以便在代码中轻松操作。

写信给卡夫卡:

byte [] value = user.toByteBuffer().array();
producer.send(new ProducerRecord<>(TOPIC, key, value));

从 Kafka 读取:

User user = User.fromByteBuffer(ByteBuffer.wrap(record.value()));

【问题讨论】:

【参考方案1】:

Schema Registry 为您提供了一种让更广泛的应用程序和服务使用数据的方法,而不仅仅是基于 Java 的微服务。

例如,您的微服务将数据流式传输到某个主题,并且您希望将该数据发送到 Elasticsearch 或数据库。如果您有 Schema Registry,那么您实际上将 Kafka Connect 连接到该主题,它现在具有架构并且可以创建目标映射或表。如果没有模式注册表,数据的每个消费者都必须以其他方式找出数据的模式是什么。

反之亦然 - 您的微服务想要访问从其他地方(例如,使用 Kafka Connect 或任何其他生产者)写入 Kafka 主题的数据 - 使用 Schema Registry,您可以简单地检索架构。没有它,您开始将微服务开发与必须了解源数据的生成位置及其模式相结合。

这里有一个关于这个主题的好讨论:https://qconnewyork.com/system/files/presentation-slides/qcon_17_-_schemas_and_apis.pdf

【讨论】:

【参考方案2】:

他们需要吗?不,不是。

您应该在主题上为自己节省一些空间,并且不发送架构作为消息的一部分,还是要求消费者拥有架构才能阅读任何内容?是的,这就是 AvroSerializer 正在为您做的事情 - 将这些数据外部化到其他地方,作为简单的 REST API 消费。

然后反序列化器必须知道该模式是如何获得的,您可以使用specific.avro.reader=true 属性对其进行配置,而不是自己手动调用fromByteBuffer,让AvroDeserializer 处理它。

此外,在较大的组织中,围绕单个 user.avsc 文件进行改组(即使版本受控)并不能控制该副本随着时间的推移变得陈旧或以干净的方式处理演变。

【讨论】:

【参考方案3】:

模式注册表最重要的功能之一是管理模式的演变。它提供了兼容性检查层。通过设置适当的兼容性类型,您可以确定允许的架构更改。

您可以找到所有可用的兼容类型here。

【讨论】:

以上是关于Avro Schema Registry 的价值是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在没有 Confluent Schema Registry 的情况下在 KafkaConnect 中使用 Avro

如何使用带有 from_avro 标准功能的 Confluent Schema Registry? [复制]

Kafka Schema-Registry

在 windows 中启动 Confluent Schema Registry

Spring Cloud Schema Registry

将 Spark 结构化流与 Confluent Schema Registry 集成