イベント駆動型アーキテクチャー(EDA)は、イベントの公開、キャプチャ、処理、ストレージを中心に構築されたソフトウェア設計モデルです。
クラウドネイティブ環境全体でEDAが多用されていることは、データレイクのようなリポジトリに静的データを蓄積することに重点を置く従来のアーキテクチャーからの大きな転換を示しています。その代わりに、組織は環境内を通過するデータを追跡する動的アプローチへと移行しつつあります。イベント駆動型システムにおいて、データ自体は本質的に価値がありますが、EDAは、時間の経過とともにイベントの価値が低下する可能性があることを認識しています。
EDAでは、イベント・プロデューサー(APIやIoTデバイスなど)がイベント・コンシューマーにリアルタイムのイベント通知を送信し、イベント・コンシューマーが特定の処理ルーチンをアクティブ化します。顧客がオンラインで注文すると、在庫システムの更新、確認のEメールの送信、倉庫でのピッキングリストの取得、出荷ラベルのキューへの登録を、1つのアクションで連鎖的にトリガーします。これらはすべて進行中のイベントです。
データ・ストリーミングは、システムや環境でのあらゆる出来事や変化を記録するデータ構造であるイベントのリアルタイムフローを中心に展開します。例としては、ユーザーによるショッピングカートへの商品の追加や、パスワードのリセットのリクエストが挙げられます。ストリーム(データストリームまたはイベント・ストリームとも呼ばれる)は、これらのイベントの継続的な配信です。
各イベントは通常、イベントまたはエンティティを識別するキー、実際のデータを保持する値、発生日時を示すタイムスタンプ、場合によってはイベント・ソースまたはスキーマ・バージョンに関するメタデータの4つの要素で構成されます。これらの要素を組み合わせることで、下流のシステムには動作に必要なものがすべて与えられます。
AI活用のグローバル・トレンドや日本の市場動向を踏まえたDX、生成AIの最新情報を毎月お届けします。登録の際はIBMプライバシー・ステートメントをご覧ください。
組織が膨大なデジタルフットプリントを管理しているのは、スペースがかなり大きいというようなものです。世界中で生成されるデータの量は1日あたり約4億テラバイトで、これは観測可能な宇宙の星に匹敵する規模です。
その数の背後には、組織を流れる何十億もの個別のビジネス・イベントがあります。データを取り込んで対処するための適切なアーキテクチャーがなければ、そのデータはすぐに古くなってしまう可能性があります。EDAこそがリアルタイム処理を運用可能なものにしています。
イベント駆動型アーキテクチャーの決定的な利点の1つは、疎結合です。イベント・プロデューサーとイベント・コンシューマーは、直接的なAPI呼び出しではなくイベントを介してやり取りするため、分散システムは互いの存在を知らなくても情報を共有できます。プロデューサーは、どのコンシューマーがイベントを受信するかを知らずにイベントを送信します。コンシューマーはリクエストを送り返さずに反応します。この分離された関係により、EDAシステムは独立して拡張することができます。場合によっては失敗しても、システム全体を停止することはありません。
マイクロサービス・アーキテクチャーはこのパターンに依存しています。各サービスは独立して動作するように設計されているため、イベント・メッセージを経由する非同期通信により、モジュール性を損なう緊密な依存関係を生み出すことなく、分散システム間で調整が可能になります。このEDAとマイクロサービスの組み合わせは、プログラムのフローが順次実行ではなくイベントによって決定されるというパラダイムであるイベント駆動型プログラミングを支えています。
EDAは、イベント・プロデューサー、イベント・コンシューマー、イベント・ブローカーという3つの主要コンポーネントに依存して、アーキテクチャーを経由してイベント・データを動かします。
イベント・プロデューサー(またはパブリッシャー)はイベントのソースであり、ユーザー・インターフェース、センサー、IoT(モノのインターネット)デバイス、マイクロサービス、または状態の変化を検知できるその他のシステムが含まれます。プロデューサーはイベントを生成し、システムの他の部分に送信しますが、それ自体はイベント処理機能を備えていません。
イベント・ブローカー(またはルーター)は、プロデューサーとコンシューマーの間に位置し、両者を分離しているため、どちらも他方への直接接続を必要としません。ブローカーはメッセージ指向ミドルウェアとして機能し、イベント・メッセージを受信し、その時系列を維持して使用可能な状態にし、適切なコンシューマーにルーティングします。
イベントのコンシューマー(またはサブスクライバー)が処理タスクを担います。イベント・チャネルを視聴し、関心のあるイベントが公開されると反応します。これにはデータベースの更新、下流プロセスの開始、情報のロギングなどがあります。
アプリまたはサービスが、システムの別の部分が認識する必要があるアクションを実行すると、ブローカーに新しいイベントを公開します。ブローカーは、イベントの順序をストリーム内の他のブローカーと比較して維持します。イベント・コンシューマーは、リアルタイムまたは後続する関連インスタンスでメッセージを取り込み、別のアクションをトリガーするために処理します。
EDAにはいくつかのアーキテクチャー・パターンが含まれますが、最も一般的なのは出版-購読モデルとイベント・ストリーミングの2つです。
出版-購読モデル(Pub/Sub)では、パブリッシャーはサブスクライバーについて知る必要はありません。イベントは共有イベントチャンネルに公開され、サブスクライバーがリアルタイムで独立して視聴し、反応することができます。一般的なブローカー実装には、イベントバス、メッセージキュー、出版-購読チャンネルなどがあり、それぞれが異なるメッセージング・パターンやオーケストレーションのニーズに適しています。
メッセージ・ブローカーは、パブリッシャーとサブスクライバー間の伝送を処理します。各イベントメッセージの受信、必要に応じて変換、順序の維持、サブスクリプションによる利用可能化を行い、消費された後は再処理できないように削除します。
Pub/Subメッセージングは、大規模なコードベースや、複数のコンシューマーに情報を放送する場合に最適です。このような場合、メッセージの永続性よりも、低遅延とファンアウト(単一のイベントを複数のコンシューマーに配信すること)が重要になります。
Pub/Subと同様に、イベント・ストリーミングはパブリッシャーとコンシューマーを切り離して非同期通信を可能にします。しかし、イベント・ストリーミング・モデルでは、コンシューマーはストリームのサブスクリプションを必要としません。プロデューサーはブローカー・ログに公開し、コンシューマーは任意の時点で介入して、(公開されたすべてのイベントを受信するのではなく)必要なイベントのみを消費できます。新聞の到着を待つのではなく、図書館に行くようなものだとお考えください。
Pub/Subとは異なり、イベント・ストリーミング・ブローカーはコンシューマーがイベントを受信した後もイベントを保持します。レコードは永続的であるため、設定可能な期間(1秒未満から永遠まで)維持されます。
コンシューマーは最近のメッセージを読んだり、最後にストリームにアクセスしたときのシリーズをバッチ処理したり、直近の関連メッセージを参照したりできます。このためイベント・ストリーミングは、不正検出システムなどの、リアルタイムのイベント更新や過去のイベントへのアクセスを必要とするアプリに最も役立ちます。
イベント・ストリーミング・テクノロジーは、対象範囲と専門分野が異なります。
これらのテクノロジーは、コンシューマーが自分のスケジュールでイベントをリクエストするプルモデルと、イベント・ブローカーが配信を決定するプッシュモデルの2つの配信モデルもサポートしています。
以前のアーキテクチャー・モデルはイベントがシステム内でどのように動くかを定義しますが、処理パターンはイベントが到達したときに何が起こるかを定義します。3つの主要なパターンは以下のとおりです。
分散システムで働くチームはイベント・ソーシングなどの補完的なパターンも適用して、状態の変化を変更不可能なイベントのシーケンスとして保管します。この手法を用いることで、任意の時点におけるシステムの状態を再構築することが可能になります。コマンド・クエリ責任分離(CQRS)は、読み取りモデルと書き込みモデルを分離することで、データの一貫性を向上させて競合を大規模に減らす、もう1つのパターンです。
オペレーターの粒度は、これらのパターンを実装する際に重要な設計上の決定になります。イベント・ハンドラー(イベントがコンシューマーに到達したときに実行される機能)は、ワークフロー全体を処理する単一の機能を使用する場合もあれば、単一のアクションを担当する各機能に限定して表示する場合もあります。
広範囲にわたるハンドラーは管理が簡単ですが、全体に影響を与えずに変更するのは困難です。ナロー・ハンドラーはより柔軟ですが、調整にはより多くのオーケストレーションが必要です。適切なバランスを見つけることが、最終的にシステムが時間の経過とともにどのように維持可能になるかを判断する決め手となります。
銀行やフィンテック・プラットフォームは、EDAを使用してトランザクション・データをリアルタイムで把握し、過去の支出パターンと実際の活動を組み合わせて機会を検知して、取引が発生するにつれてより充実した顧客プロファイルを構築します。
大手小売業者は、イベント駆動型アーキテクチャーを使用して、数千の場所の在庫レベルをリアルタイムで監視し、高収益商品の在庫が少なくなると自動的に補充注文をトリガーします。
通信会社はEDAを使用して使用状況とアクティビティー・パターンを継続的に評価し、疑わしいアカウント行動やネットワーク異常が表面化した瞬間にフラグを立てます。
医療従事者は、患者の受け入れ、モニタリング、履歴データ・ストリームを組み合わせて、関連する洞察をリアルタイムで明らかにし、実行可能な状態になった時点でリスク要因やケアのギャップにフラグを立ててます。
メーカーは、接続機器からのイベント・ストリームを使用して初期のリスク指標を検知し、生産ラインが停止した後ではなく、障害が発生する前にメンテナンスをスケジュールします。
航空会社やライドシェア・プラットフォームはEDAを使用して需要の変化をリアルタイムで検知し、ライブシグナルに基づいて数秒で価格を調整します。
イベント駆動型アーキテクチャーは、ユーザーが新たな状況を検知し、リアルタイムで対処し、意思決定を自動化し、収益機会を最大化できるようにすることで、ビジネス・イベントを活用します。EDAはまた、以下のような機能を提供することで、企業の成長の維持と加速に役立ちます。
イベント駆動型アーキテクチャーには真の利点があります。また、このパターンを採用する前にチームが理解しておくべき運用上および設計上の考慮事項についても、個別に紹介しています。
EDAでは、プロデューサーはデータを送信して忘れてしまうため、システムの異なる部分が、異なる信頼できる情報源を一時的に保持する可能性があります。チームは、どのオペレーションが一時的な乖離を許容できるか、どのオペレーションが許容できないかを慎重に考察する必要があります。例えば金融取引は、レコメンデーション・エンジンよりも厳格な保証を必要とします。
大規模になると、イベント・シーケンスを維持することは本当に困難です。顧客が配送先住所を更新した後ですぐ注文を行った場合、これらのイベントが到着した注文が、正しい住所を使用するかどうかを決定します。分散した消費者全体で正しいシーケンスを設計するには、大幅なアーキテクチャーに関する規律が必要です。
従来のシステムでは、障害の原因が明確です。EDAでは、イベントが複数のコンシューマーとルーティング・ステップを通過した後に、処理エラーがはるか下流で表面化する可能性があります。この遅延により、根本原因の分析がかなり困難になり、専用のオブザーバビリティー・ツールが不可欠になります。
安全で趣旨に添った開発を支援するAIパートナーのBobを活用して、ソフトウェア・デリバリーを加速させましょう。
信頼性の高いAI駆動型ツールを活用することで、コード作成、デバッグ、リファクタリング、コード補完に費やす時間を最小限に抑え、イノベーションに集中できる余地を広げます。
AIの導入によって重要なワークフローと業務を再構築し、エクスペリエンスとビジネス価値の最大化とリアルタイムの意思決定の最適化を達成します。