2017-08-17 6 views
1

私はカフカのトピックに使用するavroスキーマについてもっと学びたいと思っています。これは比較的新しいものです。私は、特定の状況でスキーマを進化させる方法があるのだろうかと思っていました。スキーマを更新するには、新しいフィールドをnullやデフォルト値にすることはできません。このための作業は新しいトピックを作成することですが、既存のスキーマを進化させるためのよりよい方法があります。ありがとう。スキーマの古いバージョンを待つクライアントが読むことができる新しいバージョン - Backward: - ForwardKafka Avroスキーマの進化

+1

となるだろう –

+0

そうですが、新しいトピックを作成せずにこのような状況に取り組むための作業があれば、私は不思議でした。 –

答えて

1

は、トピックの四つの可能な互換性がありますスキーマの新しいバージョンを待つクライアントは、古いバージョンを読み取ることができます 上記の両方 - NoneBoth -

上記のいずれもが、いくつかのプロデューサーは、古いデータと新しいデータが生成されます、そして消費者が新しいか古いデータを除く外になるいくつかの時間があることを考慮していません。

お客様のケースでクライアントの行動はどのようになりますか?フィールドを追加することが常に前方互換性があり

  • (古いクライアントはちょうど新しいフィールドをドロップします)
  • あなたがデフォルト値

を指定する場合にのみ、下位互換性があります場合にも、これが唯一の真実でありますデータを特定のスキーマ(対応するPOCOなど)に変換することを計画しています.jsonに変換してカスタム処理を行う場合は、両方のスキーマを新しいクライアントプロセスにすることができます。私は同じトピックにwrteするため

だから、2つのpossibe方法:

  • デフォルト値を設定します。あなたは

    (アブロスペックを引用)(オプション)このフィールド が不足しているインスタンスを読み込むときに使用されるこのフィールドのデフォルト値は、デフォルト値を誤解、それはデフォルト値が書き込まれます意味しないかもしれませんが、例えば

、あなたが行っていることとして、あなたは以前に、あなたは「NC」(または空)など セット「姓」のデフォルトができ、「名前」を持っていたし、「姓」を追加したい場合データベース。あなたのスキーマを更新することができるように

  • あなたは(デフォルトではと、comptibiliatyがbackwardである)、none(またはforward)へのあなたの互換性のデフォルトを設定します。この場合、新しいスキーマを待つクライアントは古いデータを処理できません。しかし、新しいデータだけが到着するように、互換性を変更し、すべてのプロデューサを更新してから、クライアントが新しいスキーマを待っている場合は、互換性を元に戻すか、新しいフィールドがnullにすることはできません、あなたが含まれていないすべての古いレコードをしたいと思うものを、デフォルト値を持つことができない場合は

をしたい私はオプション1

関連する問題