Avro Schema Registry 的价值是什么?

What is the value of an Avro Schema Registry?

我在 Kafka 中有很多微服务 reading/writing Avro 消息。

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

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

写入卡夫卡:

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

从卡夫卡读取:

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

他们需要吗?不,不是真的。

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

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

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

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

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

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

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

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

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