この質問は、イベント ソーシングの使用を前提としています。
イベントを再生して現在の状態を再構築する場合、イベント ハンドラーはべき等である必要があります。たとえば、ユーザーが自分のユーザー名を正常に更新すると、文字列プロパティUsernameUpdated
を含むイベントが発行される場合があります。newUsername
現在の状態を再構築するとき、適切なイベント ハンドラーがイベントを受け取り、オブジェクトのプロパティをイベント オブジェクトのプロパティにUsernameUpdated
設定します。つまり、同じメッセージを複数回処理すると、常に同じ結果が得られます。username
User
newUsername
UsernameUpdated
しかし、外部サービスと統合する場合、そのようなイベント ハンドラーはどのように機能するのでしょうか? たとえば、ユーザーがパスワードをリセットしたい場合、User
オブジェクトはPasswordResetRequested
イベントを発行する可能性があります。これは、SMS を送信するコマンドをサードパーティに発行するコードの一部によって処理されます。アプリケーションが再構築されたときに、この SMS を再送信したくありません。この状況をどのように回避するのが最善ですか?