确保与 Kafka Schema 和 OpenAPI 规范的一致性

Eri*_*oda 5 apache-kafka microservices openapi confluent-schema-registry

许多 API/微服务提供对关键资源(包括 Kafka 主题)的访问。API/微服务消息使用定义 API/微服务合约的 OpenAPI 规范进行验证。一旦微服务验证了消息,它就会发布到 Kafka 主题,此时该消息将根据 Kafka 的架构注册表(再次)进行验证。

问题在于,有两个消息定义可供验证消息(OpenAPI 规范和 Kafka 的架构注册表),并且确保两个消息定义同步是一个挑战。

考虑到这一点,我有几个问题:

  • 有没有办法将 OpenAPI 规范转换为 Kafka 架构注册表格式(反之亦然)?
  • 有没有办法让 Kafka 根据 OpenAPI 规范而不是注册表进行验证(可能不是一个很好的解决方案,因为应该使用本机 Kafka 功能)?
  • 有没有办法允许 API/微服务根据 Kafka 模式而不是 OpenAPI 规范验证其消息(同样,这可能不是一个好方法,因为 OpenAPI 规范是定义 API 消息的标准方法)?

最后,上面哪一个最有道理。还有其他更好的选择吗?

Eri*_*oda 6

经过多次尝试解决这个问题后,我得出的结论是,有一种架构方法可以让 JSON 模式、OpenAPI 规范和模式注册表很好地协同工作(我有一个可以工作的原型,但它太复杂,无法在此处展示)。这是一般方法...

首先是支持我的方法的一些事实:

  • 事实:OpenAPI (v3.1+) 是 JSON Schema 的超集;请求和响应定义 100% 符合 JSON Schema
  • 事实:Schema 注册表支持 JSON Schema;JSON 模式似乎是一等公民:它们可以在模式注册表中存储和查询;并且库(虽然不容易找到)允许 JSON Schema 与 Kafka(消费者、生产者、Confluence 的 KSQLDB)及其连接器一起使用

这意味着 JSON Schema 需要成为定义流经消息的主要方式,而不是 AVRO(我认为 Kafka 社区可能不会很喜欢这种方式)。但是通过使用 JSON Schema 可以让 OpenAPI、Schema Registry 和 JSON Schema 很好地协同工作!

换句话说,通用解决方案将具有:

  • OpenAPI 成为定义 API 的主要方式,这些 API 通常是事件流解决方案的前端
  • JSON 模式定义 OpenAPI 请求/响应格式
  • OpenAPI 规范,通过一些适当的工具(有几个可用),OpenAPI 规范可以从 JSON 模式部分组装/捆绑,因此现在 OpenAPI 和 JSONN 模式终于协调一致
  • 由于 API 请求/响应在事件管理系统中形成“事件”,并且其定义独立于 OpenAPI 规范,因此 JSON 模式现在定义事件
  • 最后,由于 JSON 模式位于模式注册表中,因此所有事件都以 Kafka 友好的方式定义,并且可以以任何正常的 Kafka 方式访问