コマンドまたはイベントを使用する必要がありますか?


14

バス通信におけるコマンドとイベントの違いは、私には少し曖昧に思えます。コマンドは1回だけ実行する必要があることを知っていますが、イベントは複数回処理できますが、コマンドまたはイベントをいつ使用するかはわかりません。

例を見てみましょう:

新しいユーザーがWebアプリケーションに登録するときに、彼にアカウントを作成し、確認メールを送信する必要があります。

アカウントを作成する -これはCreateUserCommand、バスにを送信して、専用のコンポーネントに処理させるための適切な場所のようです。

または、これは非同期バス通信で実装するべきではありませんか?ユーザーがすぐにアプリケーションにログインできるようにしたいと考えています。バスでは、コマンドがいつ実行されるかは保証されません。

メールの送信 -コンポーネントがアカウントを作成した後、2つの可能性を確認できます

  1. バスに別のコマンドを送信します SendConfirmationEmailCommand
  2. イベントを公開する UserAccountCreatedEvent

そして、電子メール送信コンポーネントがそれを取得し、それを仕事にします。

一方では、確認メールを1回だけ送信したい(コマンドを使用する)一方で、新しく登録したユーザーに関係するコンポーネントが複数存在する可能性があると考えています。ロガーまたはSMS送信者。

どのように実装しますか?

回答:


16

原則として、コマンドは実行される要求を記述し、イベントは発生した何かを記述します。

  • コマンドは、プロセッサによって実行されるいくつかのアクションを必要とし、このアクションは、このプロセッサによって1回だけ実行されるべきです。

  • イベントは、すでに実行されたアクションまたは外部で発生したアクションの通知です。いくつかのプロセッサ/エージェントは、イベントについて知ることに興味があるかもしれません。それらのいくつかは、責任の領域でこの通知に必要なコマンドまたはアクションをさらに発行する場合があります。

あなたのシナリオでは、私はそれを理解しています:

  • CreateUserCommand コマンドです
  • UserAccountCreatedEventCreateUserCommandアカウント管理サービスが正常に完了したときに発行されるイベントです

現在、2つの可能性があります。

  1. アカウント管理サービスSendConfirmationEmailCommandは、このコマンドがより専門的なサービスによって実行されることを期待しているため、バス上でそれ自体を発行します。
  2. アカウント管理サービスは、完了時にイベント通知を送信するだけで、別のサービス(通信サービス、サブスクリプションサービスなど)にメール/ sms / etc ...を送信するかどうか、およびSendConfirmationEmailCommandゲートウェイによって実行されるコマンドを発行するために必要です。

サービスバスアプローチを選択した場合、これが可能にする柔軟性を使用すること、つまりオプション2を優先することは理にかなっています。


ありがとう、それで問題は解決しました。オプション2についてさらに2つの質問があります。1.アカウント管理サービスは、コマンドの完了をどのようにして知るのですか?アカウント管理サービスの本当の目的よりも、タスクの完了時に専門サービスによって公開されたイベントを聞くことによると思います。イベントを再公開するには?冗長なようです。2.また、SendConfirmationEmailCommandを発行することになっている人もわかりませんでした。アカウント管理サービスまたは「別のサービス」?
Andrzej Gis

1)私の仮定は、アカウント管理サービスがそれ自体でジョブを実行し、正常に終了した(つまり、エラーが発生しなかった)ときにイベントを送信することでした。しかし、あなたの言うとおりです。アカウント管理サービスが永続化/データベースサービスにコマンドを送信し、ジョブ完了イベント(非同期の応答など)を監視する必要がある可能性があります。
クリストフ

@gisek 2)サービスバスでは、非常に専門的なサービスがあり、それぞれに制限付きの責任があると思います。この場合、アカウント管理は作成のみを実行し、興味のある人に作成が完了したことを通知します。他のいくつかのサービスは、反応するものを監視します。たとえば、ビジネスルールを適用してイベントをユーザーに通知するタイミングと方法を決定するコミュニケーションマネージャーがいるとします。同じサービスで1)+2)を行う場合、サービスバスはほとんど必要ありません。
クリストフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.