6

新しいプロジェクトで CQRS と EventSorcing を使用しようとしています。私は、Greg Young が数年前に提案した方法に従っています (Mark Nijhof の実装 - http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young/ )。また、このソリューションのスケーラビリティに関していくつかの問題があります。

この中でいくつかの点が言及されマーク・ナイホフの記事。しかし、現在の問題は、レポート データベースの更新を担当する Denormalizer 部分です。この部分は非同期にしたいので、バスにイベントを発行したらすぐに制御を戻したいです。Denormalizer をスタンドアロンの Web サービス (WCF) として実装し、受信イベントを処理し、コマンドのバッチでタイミングを合わせてレポート データベースを更新することを提案しました。これがボトルネックになる可能性があるため、この時点である程度のスケーラビリティも追加したいと考えています - クラスタ ソリューションです。しかし、クラスターの場合、レポート データベースの更新のシーケンスを制御することはできません (または、レポート DB でオブジェクトのバージョンをチェックする、いくつかの奇妙でバグのあるロジックを実装する必要があります)。もう 1 つの問題は、ソリューションの持続可能性です。失敗した場合、どこにも永続化しない限り、デノーマライザーで更新が失われます)。だから今、私はこの問題(デノーマライザーのスケーラビリティ)の解決策を探しています。どんな考えでも大歓迎です!

4

1 に答える 1

4

まず、デノーマライザーを別のプロセスでホストする必要があります。そこから、ドメインで発生したイベントをメッセージング インフラストラクチャに発行することができます。非正規化を高速化するための簡単な戦略の 1 つは、メッセージ/イベント タイプごとに分割することです。つまり、メッセージの種類ごとに個別のキューを作成し、対応するイベントに (メッセージ バスを使用して) デノーマライザーをサブスクライブさせることができます。これの利点は、メッセージが前後に積み重なっていないことです。すべてが並行して実行され始めます。競合が発生する可能性がある唯一の場所は、複数の型をリッスンするテーブルです。それでも、多くのエンドポイント間で負荷を分散しました。

ある種のメッセージング インフラストラクチャを使用している限り、非正規化を試みてもイベント メッセージが失われることはありません。代わりに、一定回数の失敗の再試行の後、メッセージは「有害」と見なされ、エラー キューに移動されます。問題がないかどうか、エラー キューを監視するだけです。メッセージがエラー キューにある場合は、ログをチェックしてメッセージが存在する理由を確認し、問題を修正して元に戻すことができます。

もう 1 つの考慮事項は、Mark Nijhof の例がやや古いことです。多数の CQRS フレームワークが利用可能であり、DDD/CQRS Google Groupには山ほどのアドバイスがあります。

于 2011-04-13T12:50:07.203 に答える