确保与 Kafka Schema 和 OpenAPI 规范的一致性
Ensuring consistency with Kafka Schema and OpenAPI specification
许多 API/microservices 提供对包括 Kafka 主题在内的关键资源的访问。 API/microservice 消息使用定义 API/microservice 合同的 OpenAPI 规范进行验证。一旦微服务验证了消息,它就会发布到 Kafka 主题,此时消息将(再次)根据 Kafka 的模式注册表进行验证。
问题是有两个消息定义可以验证消息(OpenAPI 规范和 Kafka 的模式注册表),确保两个消息定义同步是一个挑战。
考虑到这一点,我有几个问题:
- 有没有办法将 OpenAPI 规范转换为 Kafka 模式注册表格式(反之亦然)?
- 有没有办法允许 Kafka 根据 OpenAPI 规范而不是注册表进行验证(可能不是一个很好的解决方案,因为应该使用本机 Kafka 功能)?
- 有没有办法允许 API/Microservice 根据 Kafka 模式而不是 OpenAPI 规范验证其消息(同样,可能不是一个好方法,因为 OpenAPI 规范是定义 API 消息的标准方法) ?
最后,以上哪项最有道理。还有其他更好的选择吗?
经过多次尝试解决这个问题后,我得出结论,有一种体系结构方法可以让 JSON 架构、OpenAPI 规范和架构注册表很好地协同工作(我有一个原型可以工作,但太复杂,无法在此处展示)。这是一般方法...
首先支持我的方法的一些事实:
- 事实:OpenAPI (v3.1+) 是 JSON Schema 的超集;请求和响应定义 100% 符合 JSON Schema
- 事实:Schema Registry 支持 JSON Schema; JSON 模式似乎是第一个 class 公民:它们可以存储和查询 in/by 模式注册表;并且库(虽然不容易找到)允许 JSON Schema 与 Kafka(消费者、生产者、KSQLDB for Confluent)及其连接器一起工作
这意味着 JSON Schema 需要成为定义流经的消息而不是 AVRO 的主要方式(我认为 Kafka 社区可能不会非常喜欢这一点)。但是通过使用 JSON Schema 允许 OpenAPI、Schema Registry 和 JSON Schema 一起玩得很好!
换句话说,通用解决方案将具有:
- OpenAPI 成为定义 API 事件流解决方案中 front-ends 的主要方式
- JSON 模式定义了 OpenAPI request/response 格式
- OpenAPI 规范,使用适度的工具(有几个可用),OpenAPI 规范可以 assembled/bundled 来自 JSON Schema 部分,所以现在OpenAPI 和 JSONN Schemas 最终协调一致
- 由于 API request/response 在事件管理系统中形成“事件”,并且定义独立于 OpenAPI 规范,JSON 模式现在定义事件
- 最后,由于 JSON Schema 在 Schema Registry 中,所有事件都以 Kafka-friendly 方式定义并且可以任何正常的 Kafka 方式访问
许多 API/microservices 提供对包括 Kafka 主题在内的关键资源的访问。 API/microservice 消息使用定义 API/microservice 合同的 OpenAPI 规范进行验证。一旦微服务验证了消息,它就会发布到 Kafka 主题,此时消息将(再次)根据 Kafka 的模式注册表进行验证。
问题是有两个消息定义可以验证消息(OpenAPI 规范和 Kafka 的模式注册表),确保两个消息定义同步是一个挑战。
考虑到这一点,我有几个问题:
- 有没有办法将 OpenAPI 规范转换为 Kafka 模式注册表格式(反之亦然)?
- 有没有办法允许 Kafka 根据 OpenAPI 规范而不是注册表进行验证(可能不是一个很好的解决方案,因为应该使用本机 Kafka 功能)?
- 有没有办法允许 API/Microservice 根据 Kafka 模式而不是 OpenAPI 规范验证其消息(同样,可能不是一个好方法,因为 OpenAPI 规范是定义 API 消息的标准方法) ?
最后,以上哪项最有道理。还有其他更好的选择吗?
经过多次尝试解决这个问题后,我得出结论,有一种体系结构方法可以让 JSON 架构、OpenAPI 规范和架构注册表很好地协同工作(我有一个原型可以工作,但太复杂,无法在此处展示)。这是一般方法...
首先支持我的方法的一些事实:
- 事实:OpenAPI (v3.1+) 是 JSON Schema 的超集;请求和响应定义 100% 符合 JSON Schema
- 事实:Schema Registry 支持 JSON Schema; JSON 模式似乎是第一个 class 公民:它们可以存储和查询 in/by 模式注册表;并且库(虽然不容易找到)允许 JSON Schema 与 Kafka(消费者、生产者、KSQLDB for Confluent)及其连接器一起工作
这意味着 JSON Schema 需要成为定义流经的消息而不是 AVRO 的主要方式(我认为 Kafka 社区可能不会非常喜欢这一点)。但是通过使用 JSON Schema 允许 OpenAPI、Schema Registry 和 JSON Schema 一起玩得很好!
换句话说,通用解决方案将具有:
- OpenAPI 成为定义 API 事件流解决方案中 front-ends 的主要方式
- JSON 模式定义了 OpenAPI request/response 格式
- OpenAPI 规范,使用适度的工具(有几个可用),OpenAPI 规范可以 assembled/bundled 来自 JSON Schema 部分,所以现在OpenAPI 和 JSONN Schemas 最终协调一致
- 由于 API request/response 在事件管理系统中形成“事件”,并且定义独立于 OpenAPI 规范,JSON 模式现在定义事件
- 最后,由于 JSON Schema 在 Schema Registry 中,所有事件都以 Kafka-friendly 方式定义并且可以任何正常的 Kafka 方式访问