メッセージングとは
ストア&フォワード メカニズム
JMS における "疎結合"
1.1 メッセージングとは
"メッセージング" という言葉は、コンピュータの世界のさまざまな場面で広く使われています。例えば、OS のコンセプトを説明する場面や e-メール システムを説明する場合にも使われています。
JMS におけるメッセージングとは、アプリケーション間の非同期通信 を説明する言葉として用いられています。
そして、JMS における "メッセージ" とは、非同期に送受信されるリクエスト、レポート、イベントなどを指し、人間ではなくアプリケーション ソフトウェアによってコンシューム (受信、処理) されるものを指しています。
JMS では、アプリケーション同士が直接的に通信するのではなく、メッセージの仲介をする JMS サーバーがアプリケーション間に介在します。JMS サーバーが介在することによって、アプリケーションは相手アプリケーションの状態に関係なくメッセージの送受信が行えるようになります。つまり、アプリケーション同士は同期をとる必要がなくなり、アプリケーション間の結びつきが "疎結合" なものとなります。
(JMS クライアント同士を同期的に動作させることも可能です。)
1.2 ストア&フォワード メカニズム
JMS で定義されているメッセージング システムの環境は、図 1 のようになっています。
図 1. JMS メッセージ環境
メッセージを送り出すクライアント (メッセージ プロデューサ) は、JMS サーバーにメッセージを送信します。相手側のアプリケーションに対して送るのではありません。メッセージは、JMS サーバー上の "ディストネーション" を宛先として送られ、ディストネーション上に格納されます。メッセージを受け取る側のクライアント (メッセージ コンシューマ) は、ディストネーションにメッセージが存在すれば、それをコンシュームします (受け取ります)。プロデューサ側もコンシューマ側も相手のことを関知する必要がなく、おたがいにアノニマス (anonymous) な関係にあります。
- JMS クライアント
JMSクライアントは、JMS API (クライアント ランタイム) を使用してメッセージを送受信するプログラムです。メッセージの送り側も受け側もクライアントであり、両者の間に "サーバー" と "クライアント" という区別が無いことに留意してください。両者ともメッセージング サービスを利用するクライアントとして位置付けられています。
このことは、アプリケーション間 (メッセージの送信側と受信側) に強い関係が無いことを意味しています。
- JMS サーバー
JMS サーバーとは JMS を実装した MOM (メッセージ指向ミドルウェア) のことで、FioranoMQ サーバーもこれに該当します。
- ディストネーション
JMS サーバーが管理するオブジェクトの一つで、プロデューサが送るメッセージの宛先となります。ディストネーションに送られてきたメッセージは、ここに格納され、コンシューマがコンシューム (受信) するまで保持されます。
JMS サーバーは、ディストネーションを用いて、いわゆる "ストア&フォワード" のメカニズムを実装していることになります。
1.3 JMS における "疎結合"
JMS の "ストア&フォワード" メカニズムは、アプリケーション間の結びつきを "疎結合" なものとします。疎結合なメッセージングは、次のような大きな利点をもたらします。
- アプリケーション間の非同期な連携
CORBA に代表されるような RPC (Remote Procedure Call) では、通信を行うアプリケーションが同時に稼動している必要があります。また、アプリケーション間で同期をとるため、相手アプリケーションの処理状況に連動していなければなりません (例えば、リクエストの処理結果を受け取るまで待機するなど)。
これと異なり、非同期な連携では次の利点が得られます。
- 相手側アプリケーションに障害 (ネットワーク障害やアプリケーション自体の障害) が発生していても、メッセージを送信できる
- ディストネーションにメッセージを送った直後から、次の処理に移れる
- 耐障害性
ネットワーク障害などによってコンシューマがメッセージを受け取れない場合でも、ストア&フォワード メカニズムによってメッセージを保存しておくことができ、メッセージを損失することがありません。障害が解消した時点で、メッセージの処理を再開できます。このことは、一方のアプリケーションに障害が発生しても、他方のアプリケーションは処理を継続できることを意味し、システム全体が停止してしまうことがありません。
しかしながら、この機能は JMS サーバーとコンシューマとの間の障害についてのみ有効で、プロデューサと JMS サーバーとの間で発生した障害については機能しません。
FioranoMQ では、この問題に対処するため、クライアント サイドの永続化機能を設けました
クライアント サイドの永続化 の詳細説明
- システム変更の容易性
非同期に連携している環境では、アプリケーションを変更したり、他のアプリケーションと置き換える必要が生じても、相手アプリケーションに大きな影響をおよびしません。また、変更時にシステム全体を停止する必要がなくなります。
|