ベースライン情報: ログインに外部OAuthプロバイダーを使用しています。ユーザーが外部OAuthにログインすると、システムに入ることができます。ただし、このユーザーはまだ私のシステムに存在していない可能性があります。これは実際にはテクノロジーの問題ではありませんが、私はJOliverEventStoreをその価値のために使用しています。
論理:
- 新規ユーザー向けのGUIDは提供されていません。メールアドレスを持っています。
- コマンドを送信する前に読み取りモデルを確認します。ユーザーの電子メールが存在する場合は、IDを使用してLoginコマンドを発行し、存在しない場合は、生成されたIDを使用してCreateUserコマンドを発行します。私の問題は、新しいユーザーの場合です。
- 新しいIDでイベントストアに保存が行われます。
問題: ブラウザーの更新または読み取りモデルとの整合性が達成される前に発生するその他の異常のために、読み取りモデルが更新される前に2つの作成コマンドが何らかの形で発行されたと想定します。それは大丈夫ですそれは私の問題ではありません。
何が起こるか: 新しいIDはGuidコームであるため、イベントストアがこれらの2つのCreateUserコマンドが同じユーザーを表していることを知る可能性はありません。読み取りモデルに到達するまでに、読み取りモデルは(同じ電子メールを持っているため)認識し、2つのレコードをマージするか、その他の補正アクションを実行できます。しかし、現在、私の読み取りモデルは、これらが2つの別個のエンティティであるとまだ考えているイベントストアと同期していません。
おそらくそれは問題ではありません:
- イベントを再生すると、読み取りモデルにも同じ効果があるため、問題ありません。
- 両方のコマンドは重複する「作成」コマンドであるため、同じ情報が含まれている必要があります。したがって、イベントストアで何かを失っているわけではありません。
誰かが同様の問題をどのように処理したかを明らかにすることができますか?何らかの補正アクションを実行する必要がある場合、読み取りモデルサービスは、重複エントリがあることに気付いたときに、ある種の補正コマンドを発行しますか?私が検討していないより単純な方法論はありますか?