7.2. Service Registry でスキーマを検索するストラテジー
Kafka クライアントのシリアライザーは 検索ストラテジー を使用して、メッセージスキーマが Service Registry に登録されるアーティファクト ID およびグローバル ID を決定します。特定のトピックとメッセージについて、 ArtifactResolverStrategy
Java インターフェイスのさまざまな実装を使用して、レジストリー内のアーティファクトへの参照を返すことができます。
各ストラテジーのクラスは、io.apicurio.registry.serde.strategy
パッケージに含まれています。Avro SerDe の特定のストラテジークラスは、io.apicurio.registry.serde.avro.strategy package
に含まれています。デフォルトのストラテジー、TopicIdStrategy
は、メッセージを受信する Kafka トピックと同じ名前の Service Registry アーティファクトを検索します。
例
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
パラメーターは、シリアライズ/デシリアライズされたメッセージのスキーマです。 -
返される
ArtifactReference
には、スキーマが登録されているアーティファクト ID が含まれています。
使用する検索アップストラテジーは、スキーマを保存する方法と場所によって異なります。たとえば、同じ Avro メッセージタイプを持つ Kafka トピックが複数ある場合、レコード ID を使用するストラテジーを使用することがあります。
KeystoneOpenIdcaceResolverStrategy インターフェイス
アーティファクトリーゾルバーストラテジーは、Kafka トピックおよびメッセージ情報を Service Registry のアーティファクトにマップする方法を提供します。マッピングの共通規則は、Kafka メッセージのキーと値のどちらにシリアライザーを使用するかによって、Kafka トピック名と key
または value
を結合することです。
ただし、Service Registry によって提供されるストラテジーを使用するか、io.apicurio.registry.serde.strategy.ArtifactResolverStrategy
を実装するカスタム Java クラスを作成することにより、マッピングに代替規則を使用できます。
アーティファクト参照を返すストラテジー
Service Registry は、 ArtifaceResolverStrategy
の実装に基づいてアーティファクト参照を返すために次のストラテジーを提供します。
RecordIdStrategy
- スキーマのフルネームを使用する Avro 固有のストラテジー。
TopicRecordIdStrategy
- トピック名およびスキーマのフルネームを使用する Avro 固有のストラテジー。
TopicIdStrategy
-
トピック名と、
key
またはvalue
接尾辞を使用するデフォルトストラテジー。 SimpleTopicIdStrategy
- トピック名のみを使用する単純なストラテジー。
DefaultSchemaResolver インターフェイス
デフォルトのスキーマリゾルバーは、アーティファクトリーゾルバーストラテジーによって提供されるアーティファクト参照の下に登録されたスキーマの特定バージョンを見つけて識別します。すべてのアーティファクトのすべてのバージョンには、グローバルで一意の識別子が 1 つだけあり、それを使用してそのアーティファクトの内容を取得できます。このグローバル ID はすべての Kafka メッセージに含まれていいるため、デシリアライザーは Apicurio レジストリーからスキーマを適切に取得できます。
デフォルトのスキーマリゾルバーは、既存のアーティファクトバージョンを検索できます。見つからない場合は、使用するストラテジーに応じて登録できます。io.apicurio.registry.serde.SchemaResolver
を実装するカスタム Java クラスを作成することにより、独自のストラテジーを提供することもできます。ただし、DefaultSchemaResolver
を使用して、代わりに設定プロパティーを指定することをお勧めします。
グローバル ID を返すストラテジー
DefaultSchemaResolver
を使用する場合、アプリケーションのプロパティーを使用してその動作を設定できます。次の表は、一般的に使用される例を示しています。
プロパティー | タイプ | 説明 | デフォルト |
---|---|---|---|
|
| シリアライザーが対応するグループ ID およびアーティファクト ID のレジストリー内で最新のアーティファクトの検索を試行するかどうかを指定します。 |
|
|
| 指定された ID を Kafka に書き込むようシリアライザーに指示し、この ID を使用してスキーマを見つけるようにデシリアライザーに指示します。 |
|
|
| シリアライザーがレジストリーでアーティファクトを作成しようとするかどうかを指定します。JSON スキーマシリアライザーはこれをサポートしません。 |
|
|
| グローバル ID をキャッシュする期間をミリ秒単位で指定します。設定されていない場合は、グローバル ID は毎回フェッチされます。 |
|
アプリケーションプロパティーを Java システムプロパティーとして設定することも、Quarkus application.properties
ファイルに含めることもできます。詳細は、Quarkus のドキュメント を参照してください。
その他のリソース
- 詳細は、SerdeConfig Java class を参照しください。