如何跨团队共享 avro 模式定义
Posted
技术标签:
【中文标题】如何跨团队共享 avro 模式定义【英文标题】:how to share avro schema definitions across teams 【发布时间】:2020-01-07 21:40:03 【问题描述】:Kafka schema-registry 提供了一种使用通用数据合约对来自 Kafka 的数据进行序列化和反序列化的好方法。然而,数据契约(.avsc 文件)是生产者和消费者之间的粘合剂。
一旦生产者制作了 .avsc 文件,就可以将其签入到生产者一方的版本控制中。根据语言,它也会自动生成类。
然而,
-
对于消费者来说,下拉模式定义以供参考的最佳机制是什么?是否有类似 swaggerhub 或 avro 的典型 api 文档门户?
如果我们使用 Confluent 平台,控制中心会提供一个 gui 来查看与主题关联的架构,但它也允许用户进行编辑。生产者和消费者团队之间如何运作?什么会阻止消费者或任何人直接在 Confluent 平台上编辑架构?
这是我们需要使用 rest-proxy 自定义构建的东西吗?
【问题讨论】:
【参考方案1】:您说的是使用 Avro 架构的两种不同方式:
让架构注册表为您存储架构。 生成一个.avsc
文件并将其提供给下游消费者。
在第一种方法中,您的生产者将拥有一个 .avsc
文件,用于序列化消息并将它们发送到 Kafka,但如果您使用的是模式注册表,则无需担心消费者需要实际的 Avro 定义,因为整个 Avro 模式可以从模式注册表中使用模式 id 获得。您没有实际生成的类,没错,但您仍然可以“遍历”整个消息,并从中提取数据。
在第二种方法中,不使用模式注册表,生产者使用.avsc
文件将发送到 Kafka 的数据序列化为字节数组,然后将该文件提供给消费者/下游应用程序,通常通过源代码控制。当然,这意味着您的生产者和消费者必须在您进行架构更改时保持同步,否则您的消费者将无法读取生产者添加或修改的字段。
因此,如果您使用架构注册表,如果配置正确,Kafka 消费者将自动提取每条消息所需的架构,然后您可以提取所需的数据。另外,您还可以通过以下方式获取任何主题的最新架构:
curl -X GET "http://schema-registry.company.com:8081/subjects/your_topic-value/versions/latest/schema"
但是,如果您不使用模式注册表,则获取完整模式的唯一方法是访问用于序列化消息的 .avsc
文件,通常通过源代码控制, 正如刚才提到的。然后,您还可以共享自动生成的类(如果可用),以将您的消息直接反序列化为类。
有关如何与 Schema Registry 交互的更多信息,请参阅文档链接:https://docs.confluent.io/current/schema-registry/schema_registry_tutorial.html#using-curl-to-interact-with-schema-registry
还有一些关于一般模式兼容性以及如何在模式注册表中处理/配置的阅读 - https://docs.confluent.io/current/schema-registry/avro.html
【讨论】:
如何解析架构?还是我们应该事先知道第一种方法(注册表)的架构?【参考方案2】:这是一个有点老的问题,但答案可能对其他人有帮助。
-
我建议为此使用架构注册表,例如汇合模式注册表或 Apicurio 注册表。多亏了这一点,您将拥有一个信息来源,了解哪些模式可用、更改的历史是什么,并且您不需要在应用程序之间同步它。如果您使用代码优先,架构最后的方法,如您所描述的,则可以通过自动注册或 CI 上的某些部署管道将架构推送到注册表。
我不熟悉 Confluent 控制中心,但在我正在处理的项目 (Nussknacker) 中,我们使用的是 AKHQ 工具,该工具具有只读模式(我敢打赌,Confluent 控制中心具有相同的选项)。在 Nussknacker 的部署过程中,我们通常在某个单独的 git 存储库中拥有模式,并且通过审查过程添加新版本的模式,然后通过 CI 中的管道步骤将该模式添加到模式注册表中。 IMO 它是更好的选择,而不是自动注册或通过 GUI 添加,因为生产者和消费者双方都可以谈论 API 设计。这种方法中的 AKHQ 或其他可视化工具仅用于模式注册表状态的可视化。我们的管道步骤是使用 REST API,如 mjuarez 所述。
【讨论】:
以上是关于如何跨团队共享 avro 模式定义的主要内容,如果未能解决你的问题,请参考以下文章