2

データベースとファイル システムを含む複数のデータ ストア間でトランザクションを処理する最善の方法を教えてください。

シナリオは次のとおりです。

テキストとバイナリを含むデータを保存する必要があるシステムがあるとします。テキストはメタデータ情報を提供し、バイナリ データは格納される実際のデータです。また、クライアントが設定したメタデータに基づいてデータを検索できる必要があります。

これにより、データを 3 つの形式で格納するアーキテクチャがもたらされます。 1. バイナリ データをファイル システムに格納します。 2. ファイル システム上のバイナリ データへのポインタ (ID、場所) を含む RDBMS 内のレコード 3. インデックス内のレコードメタデータに基づく検索要件のための Solr/Lucene のようなエンジン。

Solr/Lucene インデックスが破損した場合に再インデックスを実行できるように、RDBMS の使用は信頼性のためであることに注意してください。

上記のシナリオの課題は、それぞれが異なるデータ ストアであり、独自のトランザクション動作を持っていることです。RDBMS はトランザクション機能を提供しますが、他の 2 つにはありません。

問題は、複数のデータ ストアにまたがるトランザクション動作を作成したいということです。これは、いずれかのデータ ストアで障害が発生すると、他の 2 つのデータ ストアの変更が元に戻ることを意味します。

また、情報を検索する必要があるプライマリ データ ストアをどこにするかという問題も生じます。そのため、各データ ストアへのデータ ストレージの順序が非常に重要になります。

例では、私は次のことをしたいと思います

  1. ファイルシステムにファイルを書き込む
  2. Solr/Lucene でインデックスを作成する
  3. レコードをデータベースに挿入します。

上記のケースで、データベースの挿入に失敗して再試行が行われた場合、データをファイル システムとインデックス エンジンに上書きできます。サーバーがクラッシュした場合に備えて、データベースレコードがあり、ファイルシステムにデータが保存されていないという状況は望ましくないためです。

検索が主に検索エンジンによって提供される場合、対応するレコードがデータベースに存在しない古いデータが含まれる可能性があります。これは、データ ストア全体で一貫性の問題があることを意味します。

最後のコミットまでデータストア全体の各レコードの状態を理解し、古いデータをクリーンアップする機能を備えた、ある種の状態エンジンが必要になると思います。

これを処理するための他のアプローチがあることを知りたいですか?複数のデータストアにまたがるデータの挿入と更新のような状況を処理するための他の手法は何ですか?

4

1 に答える 1