2017-06-28 1 views
1

私はKafkaを勉強しています。私はAvroを使ってKafkaのトピックをSchemaで使用するのが理にかなっています。Avro + Schema Registryを使用しているときに、スキーマ定義からメッセージをシリアライズ/デシリアライズする方法を教えてください。

しかし、それはスキーマ定義を置く場所に来るとき、私は何かが欠けています:

  • 私はスキーマレジストリを使用しますが、私のプロジェクト内のアブロファイルを持っていない場合、私はJavaクラスを生成することができますし、メッセージを送信するときに抽象レイヤーとして使用します。これはとても素晴らしいですが、私はこのファイルの複数のバージョンを複数のプロジェクトに持っています。私はそれらを同期させておくと傷つくだろうと想像することができます。

  • スキーマレジストリを使用する場合、上記の問題は解決されます。しかし今は、メッセージを作成するときにスキーマ定義から利益を得る方法はありません。GenericRecordオブジェクトを手動で生成してKafkaに送信する必要があり、生成したメッセージがスキーマと一致するかどうかを確認する方法はありません。

  • また、コンシューマ側のメッセージをデシリアライズするためにスキーマを使用する方法もありません。

メッセージのシリアル化とデシリアライズ時にスキーマ定義から利益を得る方法はありますか?

特に、スキーマレジストリを使用して、両端でこれを行う例は見つかりません。

答えて

2

右のように、スキーマレジストリを使用してスキーマのバージョニングの問題を回避する必要があります。

私は生成されたメッセージが

なぜそのスキーマと一致するかどうかを確認するためにどのような方法を持っていないでしょうか? GenericRecordをプロデューサ側で検証するために、簡単に単体テストを書くことができます。

そうでなければ、私はそれぞれの生産者と消費者側に

KafkaAvroSerializerKafkaAvroDeserializerを使用することをあなたにお勧めします。

両方がSchemaRegistryClient実装でスキーマレジストリに接続されていますCachedSchemaRegistryClientまたはMockSchemaRegistryClient(あなたのユニットテスト専用の)

  • は、シリアライザ/デシリアライザは、ここで見つけることができます:io.confluent:kafka-アブロ・シリアライザ:3.2.0
  • SchemaRegistryClientの実装では、ここで見つけることができます:io.confluent:カフカ-スキーマレジストリクライアント:3.2.0

あなたがmavenを使用する場合:

<dependency> 
    <groupId>io.confluent</groupId> 
    <artifactId>kafka-avro-serializer</artifactId> 
    <version>3.2.0</version> 
</dependency> 

<dependency> 
    <groupId>io.confluent</groupId> 
    <artifactId>kafka-schema-registry-client</artifactId> 
    <version>3.2.0</version> 
</dependency> 
関連する問題