アーキテクチャパターン

イベント駆動アーキテクチャ いべんとくどうあーきてくちゃ

イベントメッセージキュー非同期処理マイクロサービスPub/Sub疎結合
イベント駆動アーキテクチャについて教えて

簡単に言うとこんな感じ!

「何か起きたら、それに反応して動く」仕組みだよ!たとえば注文が入ったら自動で在庫を減らして、請求書を発行して、メールを送る——みたいに、「出来事(イベント)」をきっかけに複数の処理がバラバラに動き出すアーキテクチャなんだ!


イベント駆動アーキテクチャとは

イベント駆動アーキテクチャ(EDA: Event-Driven Architecture) とは、システム内で起きた「出来事=イベント」をトリガーにして、各コンポーネントが非同期に反応・処理を行う設計思想です。従来の「AがBに直接命令する」方式とは異なり、「何かが起きた」という情報を流すことで、受け取った側が自律的に動きます。

たとえばECサイトで「注文完了」というイベントが発生すると、在庫管理・請求処理・配送手配・メール通知といった複数のシステムがそれぞれ独立して反応します。注文システムは「誰が何をするか」を知らなくてよく、呼び出し元と呼び出し先が密接につながらない(疎結合) 状態を実現できます。

ビジネスの現場では、要件が頻繁に変わる現代のシステム開発において、「新しい処理を追加しても既存コードをほぼ触らなくてよい」という柔軟性が高く評価されており、マイクロサービスクラウドネイティブな設計と非常に相性が良い アーキテクチャとして普及しています。


イベント駆動の構造と登場人物

EDAには主に3つの役割があります。

役割別名役割の説明具体例
プロデューサーイベント発行者イベントを生成して流す注文サービス、センサー
イベントブローカーメッセージバス/キューイベントを仲介・配送するKafka, RabbitMQ, Amazon SQS
コンシューマーイベント購読者イベントを受け取って処理する在庫サービス、通知サービス

「Pub/Sub」で覚えよう

EDAでよく使われるパターンが Pub/Sub(パブサブ) です。これは「発行(Publish)」と「購読(Subscribe)」の略。

📰 新聞社(プロデューサー)が記事を発行 → 新聞(ブローカー)に掲載 → 読者(コンシューマー)が好きなときに読む

新聞社は読者が誰かを知らなくてよいし、読者が増えても新聞社の仕事は変わりません。これがPub/Subの本質です。

イベントの種類

種類説明
ドメインイベントビジネス上の出来事「注文が完了した」「支払いが承認された」
システムイベント技術的な出来事「サーバーが起動した」「ファイルが更新された」
CDCイベントDBの変更検知レコードが追加・更新・削除された」

歴史と背景

  • 1980年代〜 — GUIの登場により「ボタンをクリックしたら処理が走る」イベント駆動UIが一般化。WindowsやMacのアプリ開発で普及
  • 1990年代 — エンタープライズ向けに MOM(Message-Oriented Middleware) が登場。IBMのMQSeriesなどが企業間連携に活用される
  • 2000年代SOA(サービス指向アーキテクチャ)とともに非同期メッセージングが注目を集める
  • 2011年 — Apache Kafka がLinkedInによってオープンソース化。大量イベントのリアルタイム処理が現実的になる
  • 2014年AWS Lambda 登場。「イベントが来たらサーバーレスで処理する」という概念が一般化
  • 2020年代 — マイクロサービス・クラウドネイティブ設計の標準的要素として定着。CNCF(Cloud Native Computing Foundation) でも中心的テーマに

従来型(同期)との比較

EDAの特徴は、従来の「同期的なリクエスト/レスポンス型」と比較すると明確になります。

同期型 vs イベント駆動型 同期型(リクエスト/レスポンス) 注文サービス(呼び出し元) 在庫サービス(直接呼び出し)→ 待機 請求サービス(直接呼び出し)→ 待機 通知サービス(直接呼び出し)→ 待機 順番に実行・お互いを強く依存 1つ止まると全体が止まるリスク イベント駆動型(EDA) 注文サービス 「注文完了」イベントを発行 イベントブローカー(Kafka等) 在庫 サービス 請求 サービス 通知 サービス 並列実行・お互いを知らない 1つ止まっても他は動き続ける 新しいサービス追加も既存に 影響なし(オープン/クローズド)

EDAのメリット・デメリット

観点メリットデメリット
拡張性サービスを追加しても既存コード不変全体フローの把握が難しくなる
耐障害性一部障害が全体に波及しにくいデバッグ・トレースが複雑
スケール処理を並列化しやすいイベントの順序保証が必要な場合に注意
開発速度チームを独立して動かせる最終整合性(結果整合性)の設計が必要

主なメッセージブローカー比較

ツール特徴向いているユースケース
Apache Kafka高スループット・ログ永続化ログ収集・ストリーム処理
RabbitMQ柔軟なルーティング・軽量タスクキュー・RPC代替
Amazon SQS/SNSAWSフルマネージドAWSネイティブなシステム
Google Pub/SubGCPフルマネージドGCPネイティブなシステム
Azure Service BusAzureフルマネージドエンタープライズメッセージング

関連する規格・RFC

規格・RFC番号内容
CloudEvents 1.0CNCFが策定したイベントデータの標準フォーマット仕様
AsyncAPI 3.0非同期APIの記述仕様(EDAの「OpenAPI」相当)

関連用語

  • マイクロサービス — アプリを小さなサービスに分割する設計手法。EDAと組み合わせて使われることが多い
  • メッセージキュー — イベントを一時的に溜めて順番に届ける仕組み。EDAのブローカーとして機能する
  • Pub/Subモデル — 発行者と購読者を分離する非同期メッセージングパターン
  • 疎結合 — コンポーネント同士の依存を最小限にする設計原則。EDAが実現する重要な性質
  • サーバーレス — イベントをトリガーに関数を実行するクラウドサービス。EDAと非常に相性がよい
  • CQRS — 読み取りと書き込みを分離するパターン。EDAと組み合わせてイベントソーシングとともに使われる
  • 非同期処理 — 処理の完了を待たずに次の処理を行う方式。EDAの基本的な動作モデル
  • マイクロサービスアーキテクチャSOAを現代的に発展させたアーキテクチャ。EDAと併用されることが多い