デフォルトでは、ブローカーは、関係するサブスクライバーすべてにパブリケーションを送信したら、
そのパブリケーションを廃棄します。
しかし、パブリッシャーは、ブローカーがパブリケーションのコピーを保存するように指定することができます。
このパブリケーションは保存パブリケーションと呼ばれます。
保存パブリケーションのコピーは、ブローカーによって、パブリケーションのトピックで関心事を登録したすべてのサブスクライバーに送信されます。
ですから、新しいサブスクライバーは、その情報が再びパブリッシュされるまで受信を待つ必要がありません。
例えば、株式価格のサブスクリプションを登録しているサブスクライバーは、
株価が変動してリパブリッシュされるのを待たなくても、
パブリッシュされた最新の株価をすぐに受け取ります。
Publish メッセージで RetainPub がパブリケーション・オプションとして指定されていると、パブリケーションはブローカーによって保存され、そのトピックに関して以前保存されていた
パブリケーションに置き換わります。
ブローカーは各トピックおよびサブスクリプション・ポイントごとに 1 つのパブリケーションしか保存しませんので、
古いパブリケーションは、新しいパブリケーションが到着すると削除されます。
保存パブリケーションを使用するかどうかを決定するときには、以下の質問を考慮してください。
- パブリケーションには状態情報またはイベント情報が含まれていますか?
一般に、イベント情報は保存されませんが、状態情報は保存されます。
ただし、あるトピックに関するパブリケーションが出される前に、
そのトピックへのすべてのサブスクリプションが存在する場合で、
これ以上の新しいサブスクリプションが期待されない場合は、
状態情報に関するものであってもパブリケーションを保存する必要はありません。
これは、パブリケーションはパブリッシュされるとすぐにすべてのサブスクライバーに配信されるからです。
さらに、状態情報を含むパブリケーションは、非常に頻繁に (例えば、毎秒) パブリッシュされる場合、保存する必要はないかもしれません。このような頻度でパブリッシュされる場合、新しいサブスクライバー (または、
障害から回復するサブスクライバー) は、ほぼサブスクライブ直後の最新状態を受け取ります。
- 要求時にのみパブリケーションを受け取りたいですか?
保存パブリケーションを使用する場合、サブスクライバーは、
Register Subscriber メッセージの PubOnReqOnly オプションを使用して登録できます。
つまり、ブローカーは、そのサブスクライバーが更新を要求する場合にのみ、
パブリケーションをサブスクライバーに送信するということです。
次に、ブローカーは、サブスクリプションに一致する現行の保存パブリケーションをサブスクライバーに送信します。
- 保存パブリケーションと非保存パブリケーションを同じトピックで混在させられますか?
これは推奨できません。
保存パブリケーションがあり、非保存パブリケーションを同じトピックでパブリッシュする場合、
既存の保存パブリケーションは残されたままになります。
非保存パブリケーションによって更新されません。
サブスクライバーが Register Subscriber メッセージの PubOnReqOnly オプションを使用して登録する場合、
非保存パブリケーションにはアクセスできません。
ブローカーは、更新の要求に応じて、現在の保存パブリケーションだけを送信します。
- 同じトピックで保存パブリケーションをパブリッシュする複数のアプリケーションを所持できますか?
同じトピックで保存パブリケーションをパブリッシュする複数のアプリケーションを所持しないようお勧めします。
そのようなアプリケーションをいくつか所持していて、タイミングがほとんど同時の場合、
どのパブリケーションが保存されるかは不確かです。
これらのパブリッシャーが異なるブローカーを使用する場合、
同じトピックについての異なる保存パブリケーションを、それぞれのブローカーで保持することは可能です。
- サブスクライバー・アプリケーションはどのように障害から回復するのですか?
パブリッシャーが保存パブリケーションを使用しない場合、サブスクライバー・アプリケーションは、
現在の状態をローカルに保管しなければならない場合があります。
パブリッシャーが保存パブリケーションを使用する場合、サブスクライバーは、
再始動後に更新を要求して状態情報を更新できます。
ブローカーは、登録サブスクライバーが実行されていなくても、
そのサブスクライバーにパブリケーションを送り続けます。
この結果、サブスクライバー・キューでメッセージが構築されることがあります。
この構築は、サブスクライバーが Register Subscriber メッセージの PubOnReqOnly オプションを指定して登録すれば避けられます。
そして、サブスクライバーは、更新を要求するか一時動的キューを使用して、
周期的に状態を更新する必要があります。
- パブリケーションを保存するときのパフォーマンスに関する留意事項は何ですか?
ブローカーは、保存パブリケーションをデータベースに保管する必要があります。
これにより、スループットが削減されます。
パブリケーションが非常に大きい場合、各トピックの保存パブリケーションを保管するには、
膨大なディスク・スペースが必要になります。
マルチ・ブローカー環境では、保存パブリケーションは、
一致するサブスクリプションを持つ他のすべての接続ブローカーによって保管されます。
保存パブリケーションの有効期限を設定するには、
メッセージ記述子 (MQMD) の Expiry フィールドを使用します。
WebSphere Message Broker に付属するサンプル検査アプリケーションには、
Soccer Results サービスが含まれています。
このサンプルでは、モニターしているサッカーの対戦ごとに最新の点数を記録するために、
保存パブリケーションを使用します。
サンプル・コードは、このオプションをサポートするのに必要なプログラミングを示しています。
すべてのアプリケーションが保存パブリケーションをパブリッシュできるわけではなく、
すべての保存パブリケーションに有効期限日付を適用できるわけでもありません。
次の表は、どのアプリケーションが保存パブリケーションをパブリッシュできるか、
そして保存パブリケーションに有効期限日付を適用できるかどうかを示しています。
|
MQ |
SCADA |
JMS/IP |
保存 |
YES |
YES |
NO |
有効期限日付 |
YES |
NO |
NO |
表の列は、アプリケーションの 3 つのタイプを示しています。最初の行は、パブリケーションを保存パブリケーションにできるかどうか、
2 番目の行は、そのパブリケーションに有効期限日付を適用できるかどうかを示します。