書き込みデータベースと読み取りデータベースを同期するさまざまな方法について、どなたか教えていただけませんか?
現実性、パフォーマンス、実装コストなどの観点から、さまざまなテクノロジとは何か、それぞれをどのように評価しますか?
書き込みデータベースと読み取りデータベースを同期するさまざまな方法について、どなたか教えていただけませんか?
現実性、パフォーマンス、実装コストなどの観点から、さまざまなテクノロジとは何か、それぞれをどのように評価しますか?
通常、CQRS では、書き込み DB を使用して、長時間実行されるプロセス (サガ) の移行データを格納します。読み取り DB と書き込み DB を同期している場合 (両方の方法を意味していると思います)、何か間違ったことをしている可能性があります。
サービスが複数のメッセージを予期する長時間実行プロセスの場合、すべてのメッセージが到着する前にデータを一時的に保存する方法が必要です。この例は、処理に 1 週間かかるマネージャーからの承認が必要な顧客登録です。サービスには、承認が届く前に顧客情報を一時的に保存する方法が必要です。これは、この一時データを格納するために書き込み DB が使用される場所です。顧客が承認される前は、読み取り DB にはまだ何も書き込まれていないことに注意してください。
最終的に承認が来ると、サービスは書き込み DB から顧客情報を取得し、登録プロセスを完了して読み取り DB に書き込みます。この時点で、書き込み DB 内の一時的な顧客情報はその役割を果たし、書き込み DB から削除できます。双方向の同期が含まれていないことに注意してください。
顧客名の変更などのより簡単なプロセスの場合、変更を読み取り DB にすぐに書き込むことができます。この場合、一時データがないため、書き込み DB への書き込みは必要ありません。
私のように、読み取りストアをクエリ サービスが使用する (およびその非正規化された) db と見なし、書き込み db をドメイン イベントが格納されるデータベースと見なす場合、それらを特定の瞬間に同期する必要がある場合は、保存したイベントを再生するだけです。できるだけ最新にしたい場合は、バージョンで制限する必要はありません
CQRS を使用している場合、おそらく次のようなリポジトリが作成されます。
public interface IRepository<T> where T : AggregateRoot, new()
{
void Save(AggregateRoot aggregate, int expectedVersion);
T GetById(Guid id);
T GetById(Guid id, int version);
}
これが役立つことを願っています