ドメイン側のリレーショナルDBと読み取り側のNoSQL DBを使用してCQRSベースのシステムを構築しました。ドメイン側は古典的なリレーショナル・アプローチに従うが、リード側は非正規化される。 データの複製と変換は、コマンドハンドラによって発行されるイベントを使用して行われます。CQRS:Event Sourcingを使用しない読み取りモデルの更新
私は、読み取り側の同期に関する2つの質問があります
完全ドメイン側にリレーショナルデータを使用して読み取りモデルを再構築するための最良の方法は何ですか?
読み取りモデルが同期していないとします。 しかし、常に同期していても、テストデータベース をインポートするか、バルク操作を行うことができます。そのため、対応する同期読取りモデルを持たずに、既存の書込みモデルからシステムを実行するには、 が必要です。イベントソーシングを使用しないため、すべてのイベントを再生する方法はありません( )。
私は現在、各テーブルで SELECT * FROMを基本的に実行し、各エンティティを読み取り側 表現に変換する
ReadModelBuilder
と考えています。しかしこれは冗長性をもたらす。 ReadModelBuilderは、変換がどのように行われたかを知る必要があります。 コマンドハンドラがいくつかの書き込み操作を実行した後に、通常は読み取り側同期 を実行するイベントハンドラを実行します。私はイベントハンドラを破棄して、クラス単位で同期化メカニズム に置き換えることを考えました。 など。
FooRenamedEventHandler
の代わりにfoo.name
の名前を変更すると、となり、Foo
のインスタンスが書き換えられます。 しかし、これには欠点があると思います。 FooRenamedEventHandlerは、read-model内でfoo.name
という冗長な使用法を使用すると、多くの場合、 を処理することができます。UPDATE: 別のアプローチは、
ReadModelBuilder
が順次実行完了時に、読み取り側のエンティティを構築するイベントへのドメインインスタンスをセグメント化することによって、読み取りモデルエンティティを作成できるようにすることができます。 例:Article
ドメインエンティティは、Name
とPrice
です。 読み取り側モデルを構築するには、ReadModelBuilder
はドメインエンティティを検査し、ArticleCreatedEvent
,ArticleRenamedEvent
およびArticlePriceChangedEvent
を出力できます。このようにして、変換ロジックはイベントハンドラ内に留まりますが、何らかの種類のバルクレプリケーションメカニズムから呼び出すことができます。例えばReadModelBuildersは、次のようになります。
を_ UPDATE OF
interface IReadModelBuilder<TEntity>
{
//// Returns a sequence of events which replicate the read-model
//// when executed by the event handlers.
Event[] GetReplicationSequence(TEntity instance);
}
END
_を
- 同期していない読み取りモデルを一般的にどのように検出しますか?一般的なベストプラクティスはありますか?
ありがとうございます。
これは興味深い質問です。同期を外すためには、どのような状況が考えられますか? –
私は、深刻なソフトウェアシステムの生産的な使用が、データベースをスワップまたはバルク変換する必要がある状況を経験したと思います。これは、ソフトウェアのバグによって引き起こされる可能性があります。バスシステムのバグ。操作失敗による。誰かがテストデータベースを配備したいかもしれないからかもしれません。または、古いバックアップを展開する必要があるためです。確かに、両方のデータベースをバックアップとして保持することができますが、読み取り側のバックアップが失われたり破損したりすると考えられます。 – mbnx
私は理解しています。あなたがイベントを持続させない(私はEvent sourcingを使用しない)なら、あなたは簡単にreadmodelを再構築することはできません。あなたの「再ビルダー」は、書き込みモデルをリバースエンジニアリングして、奇妙ないくつかの出来事を作ろうとする必要があります。 –