CQRSについて、私が得られないことが1つあります。発生したイベントに、読み取りモデルの更新に必要な詳細が含まれていない場合に、読み取りモデルを更新する方法です。
残念ながら、これは非常に一般的なシナリオです。
例:ユーザーをグループに追加するので、addUserToGroup(userId、groupId)コマンドを送信します。これは、コマンドハンドラーによって受信、処理され、userAddedToGroupイベントが作成、保存、および公開されます。
これで、イベントハンドラーはこのイベントと両方のIDを受け取ります。これで、すべてのユーザーとそのグループの名前を一覧表示するビューが表示されます。そのビューの読み取りモデルを更新するには、ユーザーID(私たちが持っている)とグループ名(私たちが持っていない)が必要です。持っている、私たちはそのIDしか持っていない)。
したがって、問題は次のとおりです。このシナリオをどのように処理しますか?
現在、4つのオプションが頭に浮かびますが、すべて特定の欠点があります。
読み取りモデルはドメインに問い合わせます。=>ドメインには動作のみがあり、(パブリック)状態がないため、禁止されており、不可能ですらあります。
読み取りモデルは、読み取りモデルの別のテーブルからグループ名を読み取ります。=>動作しますが、一致するテーブルがない場合はどうなりますか?
必要なデータをイベントに追加します。=>これは、以前のすべてのイベントも更新する必要があり、いつか必要になる可能性のあるデータを予測できないため、機能しません。
「通常の」イベントハンドラーを介してイベントを処理しないでください。ただし、イベントストアを処理し、必要なデータを作成し、読み取りモデルを書き込むバックグラウンドでETLプロセスを開始します。=>動作しますが、このような単純なシナリオでは、これは少しオーバーヘッドが大きすぎるように見えます。
したがって、問題は次のとおりです。このシナリオを正しく処理するにはどうすればよいですか。