EIP / Event Message


イベントメッセージ

一言要約

Event Messageはメッセージングを使ったObserverパターンを実装する重要な部分

要約

アプリケーションは各アクションの協調にイベント通知を使用し、そのイベント通信にMassagingを使用したい。

どうすればアプリケーションから別アプリケーションへのイベント送信にメッセージングが使えるのか?

あるオブジェクトで発生したイベントを別のオブジェクトにて知る必要があることがある。古典的な例ではPOSAのModel-View-Controllerパターンで、このような変更通知はB2Bのような分散システムにおいて有用である。

他アプリケーションの変更イベント通知にRemote Procedure Invocationを使えるが、受信側が望んでない場合でもイベントをすぐに受け取る必要がある。

GoFのObserverパターンはイベントを送信するsubjectと受け取るobserversを設計する方法を表している。イベント通知をPRCで実装できるが欠点が目につく。

これはMessageとして非同期イベント通知を送信する方がよい。subjectは準備ができたら通知を送り、各observerは準備ができたら通知を受け取る。

アプリケーション間の信頼性が高く非同期なイベント通知にEvent Messageを使用する

EventMessageSolution.gif

subjectが発表するイベントがあるとイベントオブジェクトを作成し、メッセージにラップしてEvent Messageとしてチャネル上に送信する。observerがEvent Messageを受信するとイベントを取得し、処理する。Massagingは送信されたイベントを変更せず、ただobserverに到達することを確認する。

Event Messageは、メッセージングシステム上のどんな種類のメッセージになりえる。Javaでは、オブジェクトやXMLのようなデータをJMSを通じてObjectMessage?TextMessage?等として送信する。.NETでは、Messageにイベントを格納する。

Event MessageとDocument Messageの違いはタイミングと内容の問題で、一般的にイベントの内容はそれほど重要ではなく多くはメッセージ本体が空であり、observerに通知するために存在する。対してタイミングは非常に重要で、変更が発生するとすぐにsubjectはイベントを発行する必要があり、observerはすぐにそれを処理する必要がある。イベントは頻繁かつ迅速に配信する必要があるのでGuaranteed Deliveryはあまり役立たない。Message Expirationはイベントが速く処理されているか確認するために非常に有用である。

価格や製品の変更を他企業に通知しなければならないB2Bシステムは、Event MessageやDocument Message、あるいは両方の組み合わせを利用できる。コンピュータのディスクドライブ価格が変更されたならばそれはイベントで、新しい価格を含むディスクドライブの情報を提供する場合はイベントとして送信されるドキュメントである。新しいカタログとそのURLを知らせるメッセージはイベントであるのに対して、新しいカタログそのものを含むメッセージはドキュメントを含むイベントである。

どちらがよいだろうか?Observerパターンはpushモデルとpullモデルのトレードオフとして説明している。pushモデルは更新の一部として変更情報を通知するのに対し、pullモデルは最小限の情報を送信し、observerはsubjectにGetState?()を送ることでより詳細な情報を要求する。

Pushモデル - ドキュメントとイベントが結合されたメッセージ。メッセージ配信は、変更が発生しメッセージ内容が新しい状態であることを知らせる。全observerが詳細を知りたい時は有用だが、巨大なメッセージが頻繁に送信されるが多くのobserverは無視するという双方にとって悪いこともありうる。

Pullモデル - 3つのメッセージがある。

  1. Updateはイベントのobserverを通知するEvent Message
  2. State Requestは興味のあるobserverがsubjectからの詳細をリクエストするのに使われるCommand Message
  3. State Replyはsubjectがobserverに詳細を送るのに使うDocument Message

pullモデルの利点は更新メッセージが小さく、興味を持ったobserverのみ詳細をリクエストすることである。欠点は必要チャネル数が増え、結果としてトラフィックも増える。

メッセージングを利用したObserverを実装する詳細については第6章「Interlude: Simple Messaging」のJMS Publish/Subscribe Exampleを参照のこと。

イベントメッセージは通常、Point-to-Point Channelで単一の受信者に絞る理由はなく、Publish-Subscribe Channelでブロードキャストし全ての関与するプロセスが通知を受け取る。Document Messageは消費される必要があるので内容が失われない一方、Event Messageの受信者は忙しい際は無視できるので、subscriberは耐久性がない(Durable Subscribers?でない)。Event Messageはメッセージングを使ったObserverパターンを実装する重要な部分である。

担当者のつぶやき

  • 至極フツー

みんなの突っ込み