7.4.2 Pub/Subメッセージングモデル
Pub/Subメッセージングモデルは,パブリッシュ・サブスクライブ(Publish-Subscribe)方式でメッセージを送受信するためのモデルです。
(1) Pub/Subメッセージングモデルによるメッセージの送受信
Pub/Subメッセージングモデルでは,メッセージを作成して送信する送信側のクライアント(プロデューサー)をパブリッシャーといいます。また,メッセージを受信する側のクライアント(コンシューマー)をサブスクライバーといいます。
パブリッシャーから送信されたメッセージは,トピックという送信先に登録されます。トピックに登録されたメッセージは,そのトピックに対して配信を申し込んでいた一つまたは複数のサブスクライバーに配信されます。
Pub/Subメッセージングモデルでのメッセージの流れを次の図に示します。
メッセージは,パブリッシャーから送信され,トピックに登録されます。図の場合,トピック1にはサブスクライバー1,トピック2にはサブスクライバー2とサブスクライバー3が登録されています。このとき,トピック1に登録されたメッセージ1とメッセージ2はサブスクライバー1に配信されます。トピック2に登録されたメッセージ3はサブスクライバー2とサブスクライバー3に配信されます。
(2) Pub/Subメッセージングモデルの特徴
Pub/Subメッセージングモデルの特徴を次に示します。
- メッセージの送信〜処理実行までの特徴
-
-
一つまたは複数のパブリッシャーから,メッセージをトピックに登録できます。
-
一つまたは複数のサブスクライバーが,トピックからメッセージを取り出して処理できます。
-
サブスクライバーは,配信を申し込んだトピックに登録されたすべてのメッセージについて,受信して処理できます。ただし,メッセージセレクターで設定した基準に該当しないメッセージ,または受信する前にメッセージの有効期限が過ぎたメッセージについては受信できません。
-
メッセージは,パブリッシャーが送信した順序でトピックに登録されます。ただし,サブスクライバーで処理される順序は,それぞれのメッセージの有効期限,優先順位,またはサブスクライバーで設定されたメッセージセレクターの内容によって決まります。
-
パブリッシャーとサブスクライバーが処理を実行するタイミングには依存性があります。トピックに登録されたメッセージは,メッセージが登録される前に開始されていたサブスクライバーだけに配信されます。
-
サブスクライバーの属性に「NoLocal」を指定した場合,サブスクライバーが使用しているコネクションと同じコネクションで送信されたメッセージの受信を抑止できます。この属性のデフォルトは「false」です。
-
- システムの特徴
-
-
パブリッシャーとサブスクライバーは動的に追加・削除できます。これによって,使用状況に応じてシステムを拡張,縮小できます。
-
CJMSプロバイダとの接続で使用するコネクションは,複数のプロデューサーで共有できます。なお,コネクションを共有しているかどうかに関係なく,複数のプロデューサーから同じのトピックにメッセージを送信できます。
-
CJMSプロバイダとの接続で使用するコネクションは,複数のサブスクライバーで共有できます。なお,コネクションを共有しているかどうかに関係なく,複数のサブスクライバーから同じトピックに接続できます。
-
(3) 永続化サブスクライバーの利用
トピックに登録されたメッセージは,メッセージ登録時に開始されていたサブスクライバーだけが受信できます。通常のサブスクライバーは,停止していた期間に登録されたメッセージは受信できません。
これに対して,サブスクライバーを永続化することで,停止していた期間に登録されたメッセージも受信できるようになります。永続化したサブスクライバーを永続化サブスクライバーといいます。
永続化サブスクライバーが登録されたトピックのメッセージは,次のどちらかの状態になるまで削除されません。
-
永続化サブスクライバーに配信された場合
-
メッセージの有効期限が過ぎた場合
永続化サブスクライバーを利用する場合,そのサブスクライバーに固有の識別子と名称を登録します。登録した情報は,CJMSPブローカーによって保持されます。永続化サブスクライバーが停止しているときに登録されたメッセージは,登録した識別子および名称のサブスクライバーが再開されたときに,そのサブスクライバーに配信されます。
永続化サブスクライバーを利用した場合のメッセージの送受信の流れを次の図に示します。
永続化サブスクライバーを利用した場合のメッセージの送受信の流れについて説明します。なお,説明の番号は図中の番号と対応しています。
-
サブスクライバー1を永続化サブスクライバーとしてトピックに登録します。
識別子(ClientID)は,「1」とします。
-
パブリッシャー1が,メッセージ1をトピックに登録します。
-
サブスクライバー1は,メッセージ1をトピックから受信します。
-
サブスクライバー1を停止します。
停止した状態になると,トピックに登録されたメッセージは受信できません。
-
パブリッシャー2が,メッセージ2をトピックに登録します。サブスクライバー1は停止中のため,メッセージ2を受信できません。ただし,サブスクライバー1は永続化サブスクライバーとして登録されているため,このメッセージは登録された永続化サブスクライバーがメッセージを受信するまでトピックで保管されます。
-
サブスクライバー2を永続化サブスクライバーとしてトピックに登録します。このとき,識別子(ClientID)を「1」として,サブスクライバーの名称はサブスクライバー1と同じ値にします。
永続化サブスクライバーの情報を保持しているCJMSPブローカーは,識別子と名称からサブスクライバー2は登録済みの永続化サブスクライバーが再開したものと判断します。
-
トピックに保管されていたメッセージ2がサブスクライバー2に配信されます。
永続化サブスクライバーの指定を解除する場合は,次のどちらかの方法で解除してください。
-
cjmsicmd destroy durコマンドを実行する
-
unsubscribeメソッドを使用する
cjmsicmd destroy durコマンドについては,マニュアル「アプリケーションサーバ リファレンス コマンド編」の「cjmsicmd destroy dur(永続化サブスクライバーの破棄)」を参照してください。
unsubscribeメソッドを使用すると,サブスクライバーのために保持されたトピックの状態を解除できます。ただし,このメソッドは,次のタイミングでは使用しないでください。
-
永続化サブスクライバーの指定を解除する対象のトピックに対して,開始されているサブスクライバーがある場合
-
トピックに配信されたメッセージが,未決着のトランザクションである場合
-
そのセッションでの配信が承認されていない場合
なお,確認応答モードが「CLIENT_ACKNOWLEDGE」のセッションによって永続化サブスクライバーが作成された場合に,メッセージ受信が確認されていない状態でunsubscribeメソッドが実行されたときには,メッセージは送信先に残ってしまいます。この状況を避けるため,unsubscribeメソッドを使用する場合,事前にcjmsicmd purge durコマンドを実行して,永続化サブスクライバーに関連づけられているすべてのメッセージを削除してください。
- 注意事項
-
一時的な送信先として作成したトピックに対して,永続化サブスクライバーは登録できません。作成しようとすると,例外がスローされます。