我试图用编程的方式回答任意两个消息模式是否兼容的问题。理想情况下,每个JSON, Avro和Protobuf。我知道kafka模式注册表内部有这样的逻辑。然而,我想在部署管道中以编程方式询问,如果我在不同环境之间推广旧主题阅读器时,它是否能够读取有关该主题的最新(或历史)消息。
我知道:
- maven插件可以在消费者编译时做到这一点,但这个选项不向我开放,因为我不使用Java来实现我的"异国情调"。消费者。但是我可以生成它期望的json模式。
- 我知道我可以调用模式注册表API来询问新模式是否与旧模式兼容,但我想问一个知道自己期望的模式的读者是否与最新注册的模式兼容,而不支持。
- 我知道这个主题可以设置为FORWARD_TRANSITIVE或FULL_TRANSITIVE兼容性,并且基于我知道我可以假设我的读者将始终工作。然而,我不能控制由许多其他团队控制的大型组织中的许多主题,因此我不能强制具有许多现有主题的许多团队设置正确的策略。
- 我知道,通过仔细的测试和变更管理,我们可以手动验证兼容性。现实世界是混乱的,我们将在许多没有经验的团队中大规模地做这件事,所以任何可能出错的事情都肯定会在某个时候出错。
- 我知道其他人一定想这样做,所以如果我搜索足够努力,答案应该在那里;然而,我已经阅读了我所能找到的所有问题,我真的找不到任何实际可行的答案来回答这个问题。
我想控制的是,当我可以拉出最新注册的模式并检查它是否与正在部署的(外来的)阅读器期望的(生成的)模式兼容时,我不将阅读器提升到生产环境。
我知道我可以拉出kafka模式注册表/maven插件使用的源代码并推出我自己的解决方案,但我觉得必须有一个方便的解决方案,我可以轻松地在部署管道上编写脚本来检查"这个(生成的)模式是否是那个(发布/下载)模式的子集"。
我打开了Confluent Kafka客户端代码,写了一个简单的Java CLI,使用它的逻辑和通用的ParsedSchema
类,可以是一个具体的json,或avro,或protobuf模式。依赖项是:
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-schema-registry-client</artifactId>
<version>7.3.1</version>
</dependency>
<dependency>
<groupId>io.confluent</groupId>
<artifactId>kafka-json-schema-provider</artifactId>
<version>7.3.1</version>
</dependency>
为了能够处理avro和protobuf,它需要包含它们相应的模式提供程序依赖项。然后代码用以下命令从字符串解析json模式:
final var readSchemaString = ... // load from file
final var jsonSchemaRead = new JsonSchema(readSchemaString);
final var writeSchemaString = ... // load from file
final var jsonSchemaWrite = new JsonSchema(writeSchemaString);
然后我们可以使用我的辅助类来验证:
final var validator = new Validator();
final var errors = validator.validate(jsonSchemaRead, jsonSchemaWrite);
for( var e : errors) {
logger.error(e);
}
System.exit(errors.size());
验证器类是非常基础的,只是使用了"can be read"语义:
public class Validator {
SchemaValidator validator = new SchemaValidatorBuilder().canBeReadStrategy().validateLatest();
public List<String> validate(ParsedSchema reader, ParsedSchema writer) {
return validator.validate(reader, Collections.singleton(writer));
}
}
完整的代码在github上/simbo1905/msg-schema-read-validator
在部署时,我可以简单地卷曲注册表中编写者应该使用的最新模式(或任何历史模式)。我可以在磁盘上为阅读器生成模式。然后我可以运行这个简单的工具来检查是否兼容。
在调试器中运行,我可以看到至少有56种不同的模式兼容性规则正在为JSON模式进行检查。试图自己编写代码是不可行的。
扩展代码以添加avro和protobuf提供程序以获得ParsedSchema
应该是相对简单的,如果有人想要完全通用的话。