0

ReadDatabaseにUserテーブルがあるとします(SQL Serverを使用)。通常の読み取り/書き込みデータベースでは、2人のユーザーが同じ電子メールアドレスでテーブルに追加されないように、テーブルにインデックスのように配置できます。

したがって、別のユーザーのテーブルにすでに存在するemailadressを持つユーザーを追加しようとすると、SQLサーバーは例外をスローします。

Cqrsでは、readdatabasへの書き込みをドメインモデルから切り離すと、非同期キューに配置することで例外が返されなくなり、UIに「OK」を返します。ユーザーは、自分がデータベースに追加されたと思いますが、実際には、読み取りデータベースに追加されることはありません。

読み取りデータベースで検索を実行して、emailadressを使用してデータベースに既にユーザーが存在するかどうかを確認し、存在する場合は、例外を介してUIに戻ります。しかし、彼らが同時に保存ボタンを押した場合、データベースに対して2つのチェックを行い、データベースにemailadressを持つユーザーがいないことを確認し、問題がないことを返信します。それを私のキューに入れて、後で失敗します(一意の識別子をヒットすることによって)。

EventSource(SQL Server)からすべてのユーザーをロードし、そのコレクションをチェックして、このメールアドレスを既に持っているユーザーがいるかどうかを確認することを想定していますか?それは私も少しクレイジーに聞こえます...

どのように人々はそれを解決しましたか?

私が見ることができる方法は、非同期キューを使用せず、同期キューを使用することですが、特に書き込み先の「読み取りストレージ」が多数ある場合は、パフォーマンスに非常に悪い影響を及ぼします...

ここで助けが必要です...

4

1 に答える 1

2

CQRSセットベースの検証を検索すると、この問題の解決策が得られます。

Greg Youngは、結果整合性を採用することによるビジネスへの影響について投稿しましたhttp://codebetter.com/gregyoung/2010/08/12/eventual-consistency-and-set-validation/

JérémieChassaingは、ドメイン内の欠落している集約ルートの検出について投稿しましたhttp://thinkbeforecoding.com/post/2009/10/28/Uniqueness-validation-in-CQRS-Architecture

関連するスタックオーバーフローの質問:

CQRSでセットベースの整合性検証を処理する方法は? CQRSの検証と一意性

于 2011-06-29T13:53:15.093 に答える