ReadDatabaseにUserテーブルがあるとします(SQL Serverを使用)。通常の読み取り/書き込みデータベースでは、2人のユーザーが同じ電子メールアドレスでテーブルに追加されないように、テーブルにインデックスのように配置できます。
したがって、別のユーザーのテーブルにすでに存在するemailadressを持つユーザーを追加しようとすると、SQLサーバーは例外をスローします。
Cqrsでは、readdatabasへの書き込みをドメインモデルから切り離すと、非同期キューに配置することで例外が返されなくなり、UIに「OK」を返します。ユーザーは、自分がデータベースに追加されたと思いますが、実際には、読み取りデータベースに追加されることはありません。
読み取りデータベースで検索を実行して、emailadressを使用してデータベースに既にユーザーが存在するかどうかを確認し、存在する場合は、例外を介してUIに戻ります。しかし、彼らが同時に保存ボタンを押した場合、データベースに対して2つのチェックを行い、データベースにemailadressを持つユーザーがいないことを確認し、問題がないことを返信します。それを私のキューに入れて、後で失敗します(一意の識別子をヒットすることによって)。
EventSource(SQL Server)からすべてのユーザーをロードし、そのコレクションをチェックして、このメールアドレスを既に持っているユーザーがいるかどうかを確認することを想定していますか?それは私も少しクレイジーに聞こえます...
どのように人々はそれを解決しましたか?
私が見ることができる方法は、非同期キューを使用せず、同期キューを使用することですが、特に書き込み先の「読み取りストレージ」が多数ある場合は、パフォーマンスに非常に悪い影響を及ぼします...
ここで助けが必要です...