ドメインイベントとは?
ドメインイベントとは、業務においで〜が起きたと言う意味だと思っている。
ドメイン内での変更の副作用を明示的に実装するには、ドメインイベントを使います。
マイクロソフトのドキュメントによると、こんな画像のように、Order(注文)のドメインに注文開始ということが起きた。起きたイベントはドメイン内でコンテキストを共有することなど。
例えば?
ユーザーを作成した
そのイベントを受けて、パスワード設定のためのメールを送る
ファイルをアップロードする
そのイベントを受けて、ファイルのベリデーションやストーレージバケツを移動するなど
要は〇〇をクリックしたとかではなく、業務的な意味を持つイベント
もう少し詳しい例を言うと、ファイルアップロードのフォームを想像してみてください
- フォームでは必要な項目、ファイルアップロード、そして登録ボタンが存在する
- 項目を入力して、ファイルをアップロードした
- アップロードしたファイルは一時的に保存するStorageに保存される
- 登録ボタンを押して、ホーム画面に戻す
- アップロードステータスは
アップロード中
-
業務において「ファイルアップロード」が起こった
- 位置的に保存するStorageから、普通のStorageに移動する
- ファイルアップロード結果をDBに保存する
- 成功の場合はアップロードステータスを
成功
に変更する - ここの処理は非同期で行われる
では、なぜDomain Eventでやるのか?
- 理由は単純に、
アップロード中
→成功
に変更するまでの処理は長い - Domain Eventで実装しないとユーザーが登録ボタンを押すのに、変更が完了までAPIのレスポンスを返すまで長く待つことになってしまう
メリット
実装方法や要件によって変わりますが、基本的には
- 非同期
- イベント発行側では、処理にかかる時間は不明なので、完了まで待つのは非現実的
- 整合性を保てる
- 発行したイベントを別のマイクロサービスが処理できる
- 特定の言語にロックインされない
非同期処理のためのクラウドサービス
クラウドサービスを使って実装したい場合は、以下のサービスを使って実装できる
Amazon SQS / Cloud Tasks
- キューによる1:1のメッセージング
Amazon SNS / Cloud Pub/Sub
- Pub/Subによる1:Nのメッセージング
補足