LoginSignup
0
0

DDDにおけるDomain Eventとは?

Posted at

ドメインイベントとは?

ドメインイベントとは、業務においで〜が起きたと言う意味だと思っている。

ドメイン内での変更の副作用を明示的に実装するには、ドメインイベントを使います。

マイクロソフトのドキュメントによると、こんな画像のように、Order(注文)のドメインに注文開始ということが起きた。起きたイベントはドメイン内でコンテキストを共有することなど。

image.png

例えば?

ユーザーを作成した
そのイベントを受けて、パスワード設定のためのメールを送る

ファイルをアップロードする
そのイベントを受けて、ファイルのベリデーションやストーレージバケツを移動するなど

要は〇〇をクリックしたとかではなく、業務的な意味を持つイベント

もう少し詳しい例を言うと、ファイルアップロードのフォームを想像してみてください

  • フォームでは必要な項目、ファイルアップロード、そして登録ボタンが存在する
  • 項目を入力して、ファイルをアップロードした
    • アップロードしたファイルは一時的に保存するStorageに保存される
  • 登録ボタンを押して、ホーム画面に戻す
  • アップロードステータスはアップロード中
  • 業務において「ファイルアップロード」が起こった
    • 位置的に保存するStorageから、普通のStorageに移動する
    • ファイルアップロード結果をDBに保存する
    • 成功の場合はアップロードステータスを成功に変更する
    • ここの処理は非同期で行われる

では、なぜDomain Eventでやるのか?

  • 理由は単純に、アップロード中成功に変更するまでの処理は長い
  • Domain Eventで実装しないとユーザーが登録ボタンを押すのに、変更が完了までAPIのレスポンスを返すまで長く待つことになってしまう

メリット

実装方法や要件によって変わりますが、基本的には

  • 非同期
    • イベント発行側では、処理にかかる時間は不明なので、完了まで待つのは非現実的
  • 整合性を保てる
  • 発行したイベントを別のマイクロサービスが処理できる
  • 特定の言語にロックインされない

非同期処理のためのクラウドサービス

クラウドサービスを使って実装したい場合は、以下のサービスを使って実装できる

Amazon SQS / Cloud Tasks

  • キューによる1:1のメッセージング

Amazon SNS / Cloud Pub/Sub

  • Pub/Subによる1:Nのメッセージング

以下のような感じで実装できる
image.png

補足

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0