私は、Oracle から一連のシステム (Cassandra、Hadoop、リアルタイム処理など) にリアルタイムの更新をストリーミングする必要があるプロジェクトに取り組んでいます。ゴールデン ゲートを使用して Oracle から変更をキャプチャし、それらを Kafka に書き込み、その後、さまざまなターゲット システムが Kafka からイベントを読み取れるようにする予定です。行う必要がある設計上の決定事項がかなりあります。
更新時に Kafka に書き込むデータは?
GoldenGate は、レコード ID と更新されたフィールドの形式で更新を発行します。これらの変更は、次の 3 つの方法のいずれかで Kafka に書き込むことができます。
- 全行: フィールドが変更されるたびに、全行を発行します。これにより、「オブジェクト」の完全な表現が得られますが、おそらく行全体を取得するにはクエリを作成する必要があります。
- 更新されたフィールドのみ: 最も簡単ですが、簡単にアクセスできるオブジェクトの完全な表現がないため、操作が少し奇妙です。これをどのように Hadoop に書き込むのでしょうか?
- イベント: おそらく最もクリーンな形式 (そして Kafka に最適) ですが、db フィールドの更新をイベントに変換するには多くの作業が必要です。
データの変換とクリーンアップを実行する場所
Oracle DB のスキーマはサード パーティの CRM ツールによって生成されるため、使用するのは簡単ではありません。変なフィールド名、変換テーブルなどがあります。このデータは、(a) ソース システム ( b) ストリーム処理を使用する Kafka、(c) 各ターゲット システム。
並列コンシューマの順序どおりの処理を保証するには?
Kafka では、各コンシューマーが異なるパーティションを読み取ることができます。各パーティションは順序どおりであることが保証されています。トピックとパーティションは、各パーティションのメッセージが完全に独立していることを保証する方法で選択する必要があります。テーブルごとにトピックを選択し、record_id に基づいてレコードをパーティションにハッシュすると、ほとんどの場合はうまくいくはずです。しかし、新しい子オブジェクトが追加されるとどうなるでしょうか? 親がforeign_idを使用する前に、それが処理されることを確認する必要があります