出版-購読型モデル

出版-購読型モデル（しゅっぱん-こうどくがたモデル、）は、非同期メッセージングパラダイムの一種である。メッセージの送信者（出版側）が、特定の受信者（購読側）に直接メッセージを発行するプログラムではなく、発行（出版）されたメッセージはクラス分けされ、どんな受信者が居るのかは知らない。受信者は興味のあるクラスを指定しておき、そのクラスに届くメッセージだけを受け取り、どんな送信者が居るのかは知らない。送信者と受信者の結合度が低いため、スケーラビリティがよく、動的なネットワーク構成に対応可能である。

出版-購読型モデルはメッセージキューパラダイムと対比され、一般に大きなメッセージ指向ミドルウェアの一部として使われる。一部のメッセージシステム（Java Message Serviceなど）は、出版-購読型とメッセージキューの両モデルをサポートしている。

 メッセージのフィルタリング 
出版-購読型モデルでは、購読側は一般に出版された全メッセージの一部だけを受信する。受信メッセージの選択処理を「フィルタリング」と呼ぶ。フィルタリングにはトピックに基づくものと内容（コンテンツ）に基づくものがある。

トピックベースシステムでは、メッセージの出版は「トピック」と呼ばれる名前付き論理チャネルに対して行われる。購読側は購読しているトピック向けに出版された全メッセージを受信し、同じトピックを購読している各購読者は全員同じメッセージを受け取る。出版側は各メッセージをどのトピックに流すのかを定義しなければならない。

コンテンツベースシステムでは、メッセージの属性や内容が購読側の定義した制約にマッチしたものだけが受信される。従って購読側がメッセージの分類をしなければならない。

システムによってはこれらを組合わせている。出版側はトピックにメッセージを流し、購読側は各トピックにさらに制約を定義して受信メッセージをフィルタリングする。

 ネットワーク構成 
出版-購読型システムでは、出版側はメッセージを中間に存在するメッセージブローカーに送信し、購読側はブローカーに対して購読を登録し、ブローカーがフィルタリングを行う。ブローカーはストアアンドフォワード機能を実行し、メッセージを出版側から購読側に渡していく。

他の出版-購読型システムはメッセージブローカーを使わず、ルーティングやフィルタリングの機能を出版側や購読側に分散させる。このとき、例えばデーモンを補助として利用する。

利点

 疎結合 

出版側と購読側は疎結合されており、相手の存在を知る必要もない。トピックに関して通信さえできれば、両者はシステムのネットワーク構成も知る必要がない。また、相手の状態がどうであろうと個々のシステムは正常に稼動し続ける。一般的な密結合のクライアントサーバモデルでは、クライアントはサーバ上でサーバプロセスが動作していないときはメッセージを送ることが出来ないし、サーバはクライアントが動作していないときはメッセージを受け取れない。出版-購読型モデルでは、出版側と購読側を位置的に分離すると同時に、時間的にも分離する。出版-購読型システムの戦略として、出版側がダウンしていても、バックログを使って購読側が動作し続けるようにできる（帯域幅調整の一種）。

 スケーラブル 
出版-購読型モデルでは従来型のクライアント-サーバモデルよりも良いスケーラビリティを実現できる。これは、並列処理、メッセージキャッシング、ルーティングなどの技法による。

欠点
ブローカー（サーバ）を使った出版-購読型システムでは、購読側がブローカーに対してメッセージ送信を要求するのは帯域内で行われ、セキュリティ問題が発生する可能性がある。ブローカーを騙して間違ったクライアントにメッセージを送らせたり、クライアントがサービスを受けられないようにすることが考えられる。購読の正当性を検証するようにした場合、ブローカーが過負荷に陥る可能性もある。

ブローカーを使わないシステムでも、購読側が認証されていないメッセージを受信する可能性がある。認証されていない出版側は不正で損害を与えるようなメッセージをシステム内に送り込む可能性がある。これはシステムがブロードキャストやマルチキャストを使っているために発生する。このような不正アクセスに対する防御策としては、今のところ暗号化（SSL/TLSなど）しかない。

 参考文献 
Publish/subscribe and SOA: How EDA extends SOA and why it is important Jack van Hoof

関連項目
イベント駆動型プログラミング
Observer パターン

しゆつはんこうとくかたもてる
しゆつはんこうとくかたもてる