|
|
JMS 補完機能 (CBR (コンテンツ ベース ルーティング)) |
|
メッセージング アプリケーションでは、あるメッセージをそれを必要とするコンシューマのみに配信し、必要としないコンシューマには配信しないということが、しばしば求められます。
このようなメッセージ フィルタリング機能として、JMS にはメッセージ セレクタが定められています。
このセクションでは、JMS 仕様のメッセージ セレクタと、それを補完する FioranoMQ の CBR (コンテンツ ベース ルーティング) 機能について説明します。
JMS 仕様のメッセージ セレクタ
JMS 仕様では、メッセージのプロパティ ヘッダーに記述した値によってメッセージのフィルタリングを行う、メッセージ セレクタ機能が定義されています。この機能は、下記のように動作します。
- メッセージ プロパティ
メッセージ プロデューサは、メッセージの送信にあたり、プロパティ部にメッセージ セレクタ用の値を記述します。図 1 の例では、"name" というプロパティに値として "ABC" を設定しています。
図 1. JMS メッセージ セレクタ プロパティ
- コンシューマ側の設定
コンシューマは、接続セッションを生成する際に、受け取るメッセージのプロパティ値を指定した上で JMS サーバーに接続します。 (図 2 を参照)。
図 2. JMS メッセージ セレクタへの指定
- 配信先の選択
JMS サーバーはプロデューサからメッセージ (プロパティ値が "ABC") を受信すると、プロパティ値が適合するコンシューマにメッセージを配信します。この例では、"name = ABC" として接続しているコンシューマ (図 2 の最上段のサブスクライバ) にのみ、メッセージが配信されます
FioranoMQ CBR (コンテンツ ベース ルーティング)
ここで、次のような事例を考えてみてください。
株価データ配信の例
株価データを複数のサブスクライバーに配信するメッセージング アプリケーションを構築しようとしています。ただし、サブスクライバは配信されるすべての株価データを受け取るのではなく、興味のあるデータだけを受け取れるように、メッセージのルーティングを行います。
条件
株価データは、「業種」、「会社名」、「株価」から構成されているとします。あるサブスクライバは特定の業種 (例えば IT 業界) に属するすべての会社の株価データの配信を望むでしょうし、特定の会社のデータ配信だけを希望するサブスクライバもいます。また、別のサブスクライバは、業種や会社に関係なく株価が一定の値を超えたらデータを受け取りたいと考えています。
さて、このような条件を満たすルーティングを、JMS のメッセージ セレクタ機能で実現することを想像してみてください。
JMS 仕様のメッセージ セレクタでは、次の理由によって非常に難しいことがわかります。
- メッセージ プロパティに記述する 1 種類の値でフィルタリング条件を設定しなければならない
- 例題の条件のように少しだけ複雑なフィルタリング条件でも、プロパティに記述する値の決定には非常に複雑なアルゴリズムが必要となり、プロデューサの開発負荷、処理負荷が多大なものとなってしまう
FioranoMQ CBR の処理フロー
FioranoMQ では、メッセージ ボディ (データ本体) に XML データをおくことができます。CBR は、XML のタグ構造を利用してメッセージ データの内容を判別し、フィルタリングを行います。このため、セレクタ プロパティ値のように新たな付加情報を生成する必要がなくなり、フィルタリング条件が柔軟に設定できるようになります。
- XML データのメッセージ
図 3 は、XML データのメッセージ例です。プロデューサ (パブリッシャ) が CBR のためにヘッダーやプロパティに付加する情報は何もありません。
図 3. XML データ メッセージ
- コンシューマ側の設定
コンシューマは、JMS のメッセージ セレクター機能と同様に、接続セッションを生成する際に受け取るメッセージの条件をあらかじめ設定しておき、JMS サーバーに接続します (図 4 を参照)。この場合の条件指定は、XPATH シンタックスを用いて XML データの内容を指定します。
図 4. FioranoMQ CBR の設定
- 配信先の選択
JMS サーバーはプロデューサからメッセージ (図 3 で示した XML データ) を受信すると、XPATH で指定された条件に適合するコンシューマにメッセージを配信します。この例では、次の条件を指定しているサブスクライバに配信されます。
- Industry = IT
- Price >= 2500
|
|
|
|
|
|