2016-06-28 6 views
1

明らかに、私は、イベントを複製するためだけにイベントソースのデータストアとしてKafkaを使用しようとしていません。Kafkaでイベントソーシングスキーマを適用する

カフカのConfluent Schema Registryは、プロデューサがトピックに送信したメッセージのスキーマを検証できる点で非常に興味深いようです。しかし、私が理解していることから、各トピックはコンテナファイルのように扱われます - トピックごとに1つのスキーマ。

この制限はFileのような単一の集約のためにあなたが複数のメッセージのスキーマを持つことになり、イベント・ソース・ストリームのために動作しません:FileCreatedFileMovedFileCopiedFileDeleted。これらをそれぞれ別の話題にすると、複雑でエラーが発生しやすくなります。

同じトピックの複数のスキーマをサポートするSchema Registryのようなツールが存在しますか?

更新

上記のメッセージのそれぞれが異なるスキーマを持つことになり、明確にします。たとえば:

FileCreated

{ 
    type: "record", 
    name: "FileCreated", 
    fields: [ 
    { name: "id", type: "string" }, 
    { name: "name", type: "string" }, 
    { name: "path", type: "string" }, 
    { name: "size", type: "string" }, 
    { name: "mimeType", type": "string" }, 
    { name: "user", type: "string" }, 
    { name: "date", type: "long" } 
    ] 
} 

FileMoved

{ 
    type: "record", 
    name: "FileMoved", 
    fields: [ 
    { name: "id", type: "string" }, 
    { name: "from", type: "string" }, 
    { name: "to", type: "string" }, 
    { name: "date", type: "long" }, 
    { naem: "user", type: "string" } 
    ] 
} 

FileDeleted

{ 
    type: "record", 
    name: "FileDeleted", 
    fields: [ 
    { name: "id", type: "string" }, 
    { name: "date", type: "long" }, 
    { name: "user", type: "string" } 
    ] 
} 
+0

同じ質問ですが、avroスキーマのjsonに "oneOf"を指定する方法はありますか? – aasthetic

答えて

3

Confluent Schema Registryは、実際の支援に同じトピックのための複数のスキーマを行います。つまり、ページビューイベントやユーザープロファイルの更新を同じトピックに書き込まないようにするなど、さまざまな種類のデータに対して同じトピックを使用しないことがベストプラクティスです。

同じトピックで複数のスキーマを使用する一般的な例は、スキーマの進化を可能にすることです。ユーザープロファイル(ユーザー名、年齢、地域、優先言語、最終訪問日など)のためのより本格的なスキーマに拡張されるユーザープロファイル(例:ユーザー名と年齢のみ)の基本スキーマから始めます。 ..)。

あなたが FileCreatedを保存するかどうか

FileMovedFileCopiedFileDeleted同じトピックには、あなた次第です。いずれの場合も、Confluent Schema Registryでは、対応するスキーマ(see docs)を管理できます。

より具体的なドキュメントポインタ:

  • Register a new schema。同じ対象の下に新しい/複数のスキーマを登録するには、対応するAPI呼び出しを介して登録するだけです。新しいスキーマの登録(つまり、最初のスキーマが既にサブジェクトに登録されている場合)は、Avroの互換性設定によっては失敗する場合があります。次の点を参照してください。
  • Defining Avro compatibility settings for schemas(グローバルに、または同じ主題/トピックに対して登録されたスキーマ用)。例えば、 GET /config/(string: subject)は、サブジェクトの(Avroスキーマ)互換性レベルを返します。

引用:

スキーマが設定互換性レベルごとに(もしあれば)以前に登録されたスキーマと互換性があるべきです。設定された互換性レベルは、GET /config/(string: subject)を発行することで取得できます。 nullが返された場合はGET /configとなります。

また、valid (Avro schema) compatibility settingsは、NONE, FULL, FORWARD, BACKWARDである。したがって、同じカフカのトピックに完全に異なるデータ型を格納したい場合は、(a)対応するサブジェクト/トピックのAvroスキーマの互換性をNONEに設定し、(b)関連するAvroスキーマを登録して、その件名/トピックの下の各データタイプごとに表示されます。

+0

この機能がサポートされているドキュメントの特定のリンクを提供できますか? [クイックスタート](http://docs.confluent.io/3.0.0/quickstart.html#quickstart)を読むだけで、手順7は、最初のスキーマと互換性のない2番目のスキーマがどのように拒否されるかを示しています。同じトピックに対して複数のスキーマを登録できるようにする特定のAPIまたは構成設定がありますか? –

+0

@ MarkJMiller:私の答えを編集しました。お役に立てれば。 –

+0

清算をありがとう。 Schema Registryがイベントソーシングシナリオでスキーマを強制することができればうれしいでしょう。特にこれはKafkaドキュメントから呼び出された[特定のユースケース](https://kafka.apache.org/documentation.html#uses_eventsourcing)です。 。これらのシナリオでは、バージョンの互換性を強化する機能が優れています。 –

関連する問題