2017-08-30 5 views
4

ドメイン側のリレーショナルDBと読み取り側のNoSQL DBを使用してCQRSベースのシステムを構築しました。ドメイン側は古典的なリレーショナル・アプローチに従うが、リード側は非正規化される。 データの複製と変換は、コマンドハンドラによって発行されるイベントを使用して行われます。CQRS:Event Sourcingを使用しない読み取りモデルの更新

私は、読み取り側の同期に関する2つの質問があります

  • 完全ドメイン側にリレーショナルデータを使用して読み取りモデルを再構築するための最良の方法は何ですか?

    読み取りモデルが同期していないとします。 しかし、常に同期していても、テストデータベース をインポートするか、バルク操作を行うことができます。そのため、対応する同期読取りモデルを持たずに、既存の書込みモデルからシステムを実行するには、 が必要です。イベントソーシングを使用しないため、すべてのイベントを再生する方法はありません( )。

    私は現在、各テーブルで SELECT * FROMを基本的に実行し、各エンティティを読み取り側 表現に変換するReadModelBuilderと考えています。しかしこれは冗長性をもたらす。 ReadModelBuilderは、変換がどのように行われたかを知る必要があります。 コマンドハンドラがいくつかの書き込み操作を実行した後に、通常は読み取り側同期 を実行するイベントハンドラを実行します。

    私はイベントハンドラを破棄して、クラス単位で同期化メカニズム に置き換えることを考えました。 など。 FooRenamedEventHandlerの代わりにfoo.nameの名前を変更すると、となり、Foo のインスタンスが書き換えられます。 しかし、これには欠点があると思います。 FooRenamedEventHandlerは、read-model内でfoo.nameという冗長な使用法を使用すると、多くの場合、 を処理することができます。

    UPDATE: 別のアプローチは、ReadModelBuilderが順次実行完了時に、読み取り側のエンティティを構築するイベントへのドメインインスタンスをセグメント化することによって、読み取りモデルエンティティを作成できるようにすることができます。 例:

    Articleドメインエンティティは、NamePriceです。 読み取り側モデルを構築するには、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

_を

  • 同期していない読み取りモデルを一般的にどのように検出しますか?一般的なベストプラクティスはありますか?

ありがとうございます。

+0

これは興味深い質問です。同期を外すためには、どのような状況が考えられますか? –

+0

私は、深刻なソフトウェアシステムの生産的な使用が、データベースをスワップまたはバルク変換する必要がある状況を経験したと思います。これは、ソフトウェアのバグによって引き起こされる可能性があります。バスシステムのバグ。操作失敗による。誰かがテストデータベースを配備したいかもしれないからかもしれません。または、古いバックアップを展開する必要があるためです。確かに、両方のデータベースをバックアップとして保持することができますが、読み取り側のバックアップが失われたり破損したりすると考えられます。 – mbnx

+0

私は理解しています。あなたがイベントを持続させない(私はEvent sourcingを使用しない)なら、あなたは簡単にreadmodelを再構築することはできません。あなたの「再ビルダー」は、書き込みモデルをリバースエンジニアリングして、奇妙ないくつかの出来事を作ろうとする必要があります。 –

答えて

0

イベントを保存しない(Event sourcingを使用しない)場合は、read-modelを簡単に再構築することはできません。 Rebuilderは、何らかの形で書き込みモデルをリバースエンジニアリングする必要があり、write modelにはジョブを実行するために必要としない情報がすべて含まれていない可能性があるため、奇妙なイベントを作成する必要があります。

私の結論は、event storeまたは少なくともevent logがなければ、read-modelを再構築できないということです。このような真実の情報源がある場合は、それを再構築して、一部の永続性ですべての処理済みイベントIDのリストを使用して同期外れの状況を検出することさえできます。

+0

ありがとうございました。ドメインをリバースエンジニアリングするイベントジェネレータを使用して私の提案について考えました。あなたが正しいです、イベントは、ドメインモデルに含まれていないデータを含む可能性があります。ドメインデータを使用して計算できる場合でも、イベントジェネレータとコマンドハンドラの間に冗長ロジックが導入されます。また、データベース上のすべての新しいプロパティがイベントジェネレータの拡張を意味するため、データスキーマの変更の実装の複雑さが増します。何らかのイベントログを持つようなものは唯一の選択肢です。 – mbnx

関連する問題