ルーティングはバージョン2.1で導入されました。ルーティングを使用すると、ネットワークで複数のJMSサーバを使用できます。 各サーバ(ブローカ)は、メッセージをほかのブローカに転送できます。メッセージが転送されたブローカは、さらにほかのブローカにもメッセージを転送できます。これにより、高度なアプリケーションで、よりスケーラブルで、性能も高く、さらに柔軟性のあるメッセージシステムを作成できます。 この章では、Novell exteNd Messaging Platform JMSのルーティングについて詳しく説明します。
ルーティングの概念は、IPおよびメールメッセージングスタックで良く知られています。メッセージは、送信者から受信者に直接送られるのではなく、いくつもの中間段階を介して送られます。ルーティングは、プロデューサおよびコンシューマのアプリケーション間に単一のメッセージサーバを導入するという発想を拡張したものです。ルーティングの特長として、次の点が挙げられます。
ルーティングの利点を説明するため、4種類の基本的なネットワークトポロジ(次の図1)を参照してください。ここで、いくつかの専門用語を紹介します。このガイドでは、「ダウンストリーム」という用語を使用します。これは、特定のノードからアクセスできるすべてのノードという意味です。たとえば、図のファンアウトで、c13とc14は、c11とc12の両方のダウンストリームです。同様に、「アップストリーム」という用語も使用します。これは、特定のノードに対するメッセージソースのノードという意味です。
図1: 基本的なネットワークトポロジ
これらのトポロジではそれぞれ特別な利点があります。
ルーティングが展開される通常の構成には、ローカル/リモートブローカがあります。この場合、ネットワークの各マシンには、常に使用できるものと仮定できるローカルブローカ(ローカルマシンで実行)があります。各ローカルブローカは、1つまたは複数のリモートブローカと通信します。リモートブローカはメッセージを分配します。ローカルブローカとリモートブローカ間の接続が使用できない場合、これは、クライアントに対して完全に透過的になります。
JMSは、各サーバで任意の数のルーティングターゲットブローカを許可することで、ルーティングをサポートしています。ターゲットブローカは、クラスタリングの場合と同様に、ホスト/ポートを使用して指定されます。また、クラスタリングと同様に、メッセージ転送は、キューやトピックにより異なります。
同じネットワークのメッセージブローカ間での宛先は自動的には同期化されません。宛先があるブローカに作成され、このブローカから次のブローカにメッセージが送られる場合、次のブローカにはこの宛先は自動作成されません。トピックメッセージが、メッセージの宛先をホストしないブローカに送られる場合、メッセージは破棄されます。ただし、キューメッセージが転送できない場合、これは、特別なエラーキュー(設定されている場合)に保存されます。
このような機能により、単一サーバシステムと同じキューおよびトピックのセマンティックが提供されます。トピックサブスクライバは、最初のサブスクライブ後にトピックに送信されるすべてのメッセージを受信します。キュー受信者は、未処理メッセージをキューからラウンドロビン方式で受信します。唯一異なる点は、コンシューマが、メッセージの本来の送信先ではないサーバからでもメッセージを受信できるという点です。
ローカル/リモートブローカは、一般的な構成です。この構成は、特に、HTTP転送と併用すると、たとえば、ラップトップでインターネットを使用してリモートブローカにメッセージを送ることができます。次の図2にこの構成を示します。
図2: Novell exteNd Messaging Platform JMSのローカル/リモートブローカ
メッセージのプロデューサは、ローカルブローカを使用します。この場合、このローカルブローカは、ファイル保存を使用するように設定されています(「ライト」メッセージサーバ)。次に、ローカルブローカは、HTTPを使用してメッセージをリモートブローカに送ります。つまり、メッセージはインターネットに送られます。 リモート側では、ORBのHTTPトンネルが着信HTTPトラフィックを受信して、リモートブローカに転送します。
ルーティングはJMQMessageServiceインタフェースから次のプロパティを使用して設定されます。
msgsvc.router.targets - このブローカのメッセージ転送先となる他のブローカのURLのカンマ区切りリスト。例:
godel:3506, escher:3506
msgsvc.router.topics - 他のブローカに送られるメッセージのトピックのカンマ区切りリスト。これは、通常、送信されるメッセージの量を制限するときに使用します。例:
topic0, topic1
msgsvc.error.queue - ローカルエラーメセージが保存されるキュー。メッセージブローカが、このブローカにバインドされないキューに対して指定された送信メッセージを受信し、メッセージを転送する他のルーティング宛先またはクラスタメンバーがこのブローカにない場合、そのメッセージはこのエラーキューに保存されます。エラーキューを指定しない場合、メッセージは破棄されます。このプロパティで指定されるキューが存在しない場合、自動的に作成されます。
これらのプロパティは、JMSサーバプログラムjmqservで使用されるmsgsvc.propertiesファイルの一部です。