7.2. 在 Service Registry 中查找 schema 的策略
Kafka 客户端序列化程序使用 查找策略来 决定在 Service Registry 中注册消息 schema 的工件 ID 和全局 ID。对于给定的主题和消息,您可以使用 ArtifactReferenceResolverStrategy
Java 接口的不同实现来返回对 registry 中工件的引用。
每个策略的类位于 io.apicurio.registry.serde.strategy
软件包中。Avro SerDes 的特定策略类位于 io.apicurio.registry.serde.avro.strategy 软件包中
。默认策略是 TopicIdStrategy
,它查找 Service Registry 工件,其名称与 Kafka 主题的信息相同。
示例
public ArtifactReference artifactReference(String topic, boolean isKey, T schema) { return ArtifactReference.builder() .groupId(null) .artifactId(String.format("%s-%s", topic, isKey ? "key" : "value")) .build();
-
topic
参数是接收消息的 Kafka 主题的名称。 -
当消息键被序列化时,
isKey
参数为true
,当消息值被序列化时为false
。 -
schema
参数是消息序列化或反序列化的 schema。 -
返回的
ArtifactReference
包含注册 schema 的工件 ID。
您使用的查找策略取决于您存储模式的方式和位置。例如,如果您有具有不同 Avro 消息类型的 Kafka 主题,则可能会使用 记录 ID 的策略。
工件解析器策略
工件解析器策略提供了一种将 Kafka 主题和消息信息映射到 Service Registry 中的工件的方法。映射的常见约定是将 Kafka 主题名称与 键或
值
合并,具体取决于 serializer 是否用于 Kafka 消息键或值。
但是,您可以使用 Service Registry 提供的策略,或创建自定义 Java 类来实现 io. apicurio.registry.registry.serde.strategy.ArtifactReferenceResolverStrategy
来使用映射。
返回对工件的引用的策略
Service Registry 提供以下策略,以根据 ArtifactReferenceResolverStrategy
的实现返回对工件的引用:
RecordIdStrategy
- Avro 特定策略使用 schema 的完整名称。
TopicRecordIdStrategy
- Avro 特定策略使用主题名称和 schema 的全名。
TopicIdStrategy
-
使用主题名称和
键或
值后缀的默认策略
。 SimpleTopicIdStrategy
- 仅使用主题名称的简单策略。
DefaultSchemaResolver 接口
默认模式解析器会查找并识别工件解析器策略提供的工件引用下注册的 schema 的特定版本。每个工件的每个版本都有一个全局唯一标识符,可用于检索该工件的内容。这个全局 ID 包括在每个 Kafka 消息中,以便 deserializer 可以正确从 Apicurio Registry 获取 schema。
默认模式解析器可以查找现有的工件版本,或者如果找不到,可以根据使用哪个策略来注册一个版本。您也可以通过创建一个实现 io.apicurio.registry.resolver.SchemaResolver
的自定义 Java 类来提供自己的策略。不过,建议您使用 DefaultSchemaResolver
并指定配置属性。
配置 registry 查找选项
使用 DefaultSchemaResolver
时,您可以使用应用程序属性配置其行为。下表显示了一些常用的示例:
属性 | 类型 | 描述 | 默认 |
---|---|---|---|
|
| 指定序列化器是否尝试在 registry 中查找对应的组 ID 和工件 ID 的最新工件。 |
|
|
| 指示 serializer 将指定的 ID 写入 Kafka,并指示 deserializer 使用这个 ID 找到 schema。 | 无 |
|
| 指定序列化器是否试图在 registry 中创建工件。JSON 架构序列化器不支持它。 |
|
|
| 指定以毫秒为单位缓存全局 ID 的时长。如果没有配置,则每次都会获取全局 ID。 | 无 |