【ドメインイベント】

ドメインイベント とは?

最終更新:
💡 業務で起きた事実を、名前と情報で伝える

業務の中で起きた意味のある出来事を、業務の言葉で表したもの。「注文が確定した」などの事実を、同じドメイン内の別の処理に伝えます。外部サービスへの統合イベントとは区別します。

📌 このページのポイント
ドメインイベント:業務で起きた事実同じドメインの内部注文を確定する注文が確定した内部のハンドラーOrderPlaced:起きた事実を表す名前外部通知は統合イベントとして別に設計確定後の発行・送信・再送・受信の契約外部通知やブローカーは必須ではない
内部の出来事をハンドラーへ伝える例です。別の集約への反映などに使い、内部イベントがそのまま外部へ必ず配信されるわけではありません。
ひよこ ひよこ
ドメインイベントは普通のイベントと違う?
ペンギン先生 ペンギン先生
イベントにはUI操作や通信などいろいろあるけど、ドメインイベントは業務上の意味を表すんだ。「クリックされた」ではなく「注文が確定した」のように、業務の言葉で説明できる出来事だよ。
ひよこ ひよこ
どうやって名前を付ける?
ペンギン先生 ペンギン先生
OrderPlacedやPaymentCompletedのように、起きた事実を過去形で表すのが一般的だよ。「注文して」という要求とは違う。注文IDなど、受け取る処理が必要とする情報も一緒に持たせるんだ。
ひよこ ひよこ
誰が受け取るの?
ペンギン先生 ペンギン先生
同じドメイン内のイベントハンドラーが、別の集約に関する処理などを担当する。通常は同じプロセス内で配信でき、同期・非同期は設計によるよ。必ずKafkaを用意するわけではないんだ。
ひよこ ひよこ
別サービスにもそのまま送る?
ペンギン先生 ペンギン先生
外部へ伝えるときは統合イベントと区別して設計しよう。業務データが確定してから発行し、公開する項目や互換性も決める。同じ名前や情報を使う場合でも、内部の変更が外部の契約を壊さないようにするんだ。
ひよこ ひよこ
Outboxを使えば失敗しない?
ペンギン先生 ペンギン先生
業務データと送信待ち記録を同じトランザクションで保存し、後から送ることで、保存だけ成功して通知を失う問題に対処できる。ただし再送による重複や順序、受信側の処理も設計が必要だよ。イベントを導入するだけで完全な配信が保証されるわけではないんだ。
もっと詳しく知りたい人へ

イベントソーシングと同じこと?

違います。ドメインイベントを使っても、現在の状態を通常のテーブルに保存できます。イベントソーシングは、イベントの履歴から状態を再構築する保存方式で、別の設計判断です。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ドメインイベント」って出てきたら「業務で起きた事実を伝えるもの」と思えばだいたいOK!
📖 おまけ:英語の意味
「Domain Event」 = 業務領域で起きた出来事
💬 Domainは業務領域、Eventは出来事。DDDでは業務の言葉で意味のある事実を表し、関連する処理を分けるために使います。

参考資料

← 用語集にもどる