私はどちらかというと、1 つのデータベース (PostgreSQL や ElasticSearch など) を単独で使用することに慣れています。しかし、現在、私はプロトタイプアプリでミックス (PG と ES) を使用しており、ミックスに他の種類のデータベースをスローする可能性があります (例: redis)。
一部のデータを異なる方法で各データベースに永続化する必要があるとします。 コンポーネント/データベースの 1 つで障害が発生した場合、システムの一貫性をどのように維持しますか?
私が直面しているシナリオの例: PostgreSQL でのデータ更新、ElasticSearch は利用できません。この時点で、両方のデータベースを更新する必要があったため、システムに一貫性がありません。私は SQL データベースを使用しているので、トランザクションを中止するだけで、システムを以前の一貫した状態に戻すことができます。
しかし、システムの一貫性を保つ最善の方法は何でしょうか?
- 値がすべてのデータベースで保持されていることを毎回確認しますか?
- 故障時は元の状態に戻す?しかし、一部の NoSQL データベースにはトランザクション/ACID メカニズムがないため、以前の状態に簡単に戻すことはできません。
さらに、複数のデータベースを同期しておく必要がある場合、データベースを同期に戻すことができるように、ある種の「バージョン」メタデータ (タイムスタンプまたは自家製のインクリメント バージョン番号) を追加するなどの良い方法はありますか? (組み込みのCouchDBについては話していません!)
さらに、データベースはすべてアトミックに更新されるわけではないため、一部の部分が短期間矛盾します。アプリのビジネスにもよると思いますが、私が発生した問題やその修正方法について何か考えている人はいますか?それは難しいにちがいないし、多くの構成に依存していると思います (おそらく、実際の利点はほとんどありません)。
これは一般的なアーキテクチャの問題であると思いますが、この件に関する情報を見つけるのに苦労しています。