如何通过引用 Kafka 主题上的另一个模式来更新 Avro 模式?

How to update Avro schema with a reference to another schema on a Kafka topic?

如果 Kafka 主题上的 Avro 模式被用作另一个模式中的参考,更新该模式的正确方法是什么?

例如,假设我们有两个 Kafka 主题:一个使用 Avro 模式 User {"type" : "record", "namespace" : "test", "name" : "User", "fields" : [{"name": "username", "type": "string"}]},第二个使用 UserAction {"type" : "record", "namespace" : "test", "name" : "UserAction", "fields" : [{"name": "action", "type": "string"}, {"name": "user", "type": "test.User"}]}.

然后我想向用户添加一个附加字段 - 一个“姓氏”,因此它看起来像这样:... "fields" : [{"name": "username", "type": "string"}, {"name": "surname", "type": ["string", "null"], "default": null}],null 以使此更改兼容。为此,我可以更改 Avro 架构文件,使用 Maven 架构插件重新生成 POJO,然后如果我使用 KafkaTemplate 向第一个主题发送消息,架构将被更新并且新字段将在主题上可见.

问题是,如果我将带有 UserAction 的消息发送到第二个主题,它仍然会引用旧的用户架构,没有“姓氏”字段,即使 POJO 会正确地看到它。因此,发送的任何“姓氏”都不会存储在主题中,并且会在消费者中作为 null 接收。

有没有办法强制更新第二个主题上的 UserAction 架构以引用新的用户架构?

虽然 Confluent Schema Registry allows for references at registration time,但我认为它不会动态更新,因为您只更改一个模型。

相反,您可以定义一个模式“monorepo”,您可以在其中一起打包和注册您的模式更改。

例如,在 Avro IDL 中,您可以定义一个文件

record User {
  // fields here
}

record UserAction {
  User user;
  string action;
}

如果您使用 Avro Maven 插件 idl-schemata 操作,它将在两个输出 AVSC 模式文件中反映所有用户更改。

创建 Java 模型后,它将包含所有必需的字段。尽管如此,您仍需要单独更新依赖于这些模型的所有外部客户端。