如何跨团队共享 avro 模式定义

how to share avro schema definitions across teams

Kafka schema-registry 提供了一种使用通用数据契约对来自 Kafka 的数据进行序列化和反序列化的好方法。但是,数据契约(.avsc 文件)是生产者和消费者之间的粘合剂。

一旦生产者制作了 .avsc 文件,就可以将其签入到生产者方面的版本控制中。根据语言,它也会自动生成 类。

然而,

  1. 消费者下拉架构定义以供参考的最佳机制是什么?是否有 swaggerhub 或典型的 api avro 文档门户?
  2. 如果我们使用 Confluent 平台,控制中心会提供一个图形用户界面来查看与主题关联的模式,但它也允许用户进行编辑。生产者和消费者团队之间如何运作?什么会阻止消费者或任何人直接在 Confluent 平台上编辑模式?
  3. 这是我们需要使用 rest-proxy 自定义构建的东西吗?

您谈论的是使用 Avro 模式的两种不同方式:

  • 让架构注册表为您存储架构。
  • 正在生成 .avsc 文件并将其提供给下游消费者。

在第一种方法中,您的生产者将有一个 .avsc 文件用于序列化消息并将它们发送到 Kafka,但如果您使用模式注册表,则无需担心关于需要实际 Avro 定义的消费者,因为整个 Avro 模式可以使用模式 id 从模式注册表中获得。您没有实际生成的 类,没错,但您仍然可以 "walk" 整个消息,并从中提取数据。

在第二种方法中,没有使用模式注册表,生产者使用.avsc文件将发送到 Kafka 的数据序列化为字节数组,并且然后,通常通过源代码管理,consumer/downstream 应用程序可以使用该文件。当然,这意味着无论何时更改架构,您的生产者和消费者都必须保持同步,否则您的消费者将无法读取生产者添加或修改的字段。

因此,如果您使用架构注册表,Kafka 消费者(如果配置正确)将自动提取每条消息所需的架构,然后您可以提取所需的数据。另外,您还可以通过以下方式获取任何主题的最新架构:

  curl -X GET "http://schema-registry.company.com:8081/subjects/your_topic-value/versions/latest/schema"

但是,如果您没有使用模式注册表,获得完整模式的唯一方法是访问用于序列化的.avsc文件消息,通常通过源代码控制,如上所述。然后,您还可以共享自动生成的 类,如果可用,将您的消息直接反序列化为 类。

有关如何与 Schema Registry 交互的更多信息,这里是 link 文档:https://docs.confluent.io/current/schema-registry/schema_registry_tutorial.html#using-curl-to-interact-with-schema-registry

还有一些关于一般架构兼容性的阅读以及它在架构注册表中的 handled/configured - https://docs.confluent.io/current/schema-registry/avro.html

这是一个有点老的问题,但答案可能对其他人有帮助。

  1. 我建议为此使用架构注册表,例如Confluent Schema 注册表或 Apicurio 注册表。多亏了这一点,您将拥有一个信息源,了解哪些模式可用、更改历史记录是什么,并且您不需要在应用程序之间同步它。如果您首先使用代码,如您所描述的模式最后方法,则可以通过自动注册或通过 CI.
  2. 上的某些部署管道将模式推送到注册表
  3. 我不熟悉 Confluent Control Center,但在我正在处理的项目 (Nussknacker) 中,我们使用的是 AKHQ 工具,它具有 read-only 模式(我敢打赌 Confluent Control Center 具有相同的模式选项)。在 Nussknacker 的部署过程中,我们通常在一些单独的 git 存储库中有模式,并且添加新版本的模式是通过审核过程完成的,之后该模式通过 CI 中的管道步骤添加到模式注册表中。 IMO 它是更好的选择,而不是 auto-registration 或通过 GUI 添加,因为生产者和消费者双方都可以讨论 API 设计。这种方法中的 AKHQ 或其他可视化工具仅用于模式注册表状态的可视化。我们的管道步骤使用 REST API,如 mjuarez 所述。