パブリッシュ/サブスクライブ・メッセージングを用いるワークロード共有

パブリッシュ/サブスクライブ・メッセージングでは、メッセージング・システムがパブリッシュされたすべてのメッセージの 1 つのコピーを対応するそれぞれのサブスクリプションに送ります。 サブスクライバー、すなわちパブリッシュ/サブスクライブ・メッセージを消費するアプリケーションは、個別のサブスクリプションからこうしたメッセージを消費します。 アプリケーションの複数のインスタンス間でワークロードのバランスを取るためには、例えば、アプリケーションがサーバー・クラスターで実行する場合、アプリケーションのすべてのインスタンスが同じサブスクリプションを使用する必要があります。

図 1 は、この構成では、サブスクリプションに送信される各メッセージを処理するアプリケーションのインスタンスが 1 つのみであることを示しています。 ただし、 図 2 は、同じアプリケーションの異なるインスタンスが異なるサブスクリプションからメッセージを受信するように構成されている場合に、各インスタンスが一致するすべてのメッセージのコピーを処理して、各メッセージが分散 (ファンアウト) されることを示しています。

図1: 単一サブスクリプションを共有するアプリケーション・インスタンス (ワークロード共有)
パブリッシャーからの 3 つのメッセージは単一のサブスクリプションに送られ、各メッセージは 3 つの別個のアプリケーション・インスタンスのうちの 1 つにのみ送られます。
図2: 個別のサブスクリプションを使用するアプリケーション・インスタンス (メッセージの拡散)
パブリッシャーからの 3 つのメッセージはすべて 3 つのサブスクリプションに送られ、3 つのメッセージはすべて 3 つの別個のアプリケーション・インスタンスのそれぞれに送られます。

Point-to-Point メッセージの場合、キュー宛先を使用し、キューをパーティション化して、メッセージのワークロード・バランシングを行うことができます。 ただし、このような方法でサブスクリプションを区画に分割することはできません。

パブリッシュ/サブスクライブ・メッセージングの場合、同じサブスクリプションを使用するように 複数のアプリケーション・インスタンスを構成して、メッセージのワークロードのバランスを取るには、永続サブスクリプションを使用する必要があります。 アプリケーションの複数インスタンスが同じサブスクリプションから同時に消費できるようになっている必要があります。 このタイプのサブスクリプションは、 共有永続サブスクリプションと呼ばれます。 共有永続サブスクリプションを構成するには、関係する接続ファクトリーまたはアクティベーション・スペックに「永続サブスクリプションの共有」プロパティーを設定します。

永続サブスクリプション には、ホーム・メッセージング・エンジンと、クライアント ID とサブスクリプション名から形成される固有 ID があります。 メッセージング・システムは、アクティブ・サブスクライバーがないときにも、サブスクリプションの一致する新規パブリケーションを累積できます。 ホーム・メッセージング・エンジンは、公開ポイントを使用してサブスクリプションのメッセージを累積します。 サブスクライバーが始動または再始動すると、メッセージング・システムが固有の ID およびホーム・メッセージング・エンジンを使用して、公開ポイントを識別し、永続サブスクリプションを見つけて、累積されたメッセージをすべて配信します。

非永続サブスクリプション には、固有の ID はありません。 対応のサブスクライバーが存続する限り、存在します。 複数のアプリケーション・インスタンスが同じ非永続サブスクリプションからのメッセージを受信することはできません。

「共有永続サブスクリプション」プロパティーを以下のいずれかに設定できます。
クラスター
バスは、クライアントが同じクライアント ID と永続サブスクリプション名を使用する場合に、同じクラスター内のバス・メンバーに接続するそれらのクライアント間で作業を分散します。
常に共有
バスは、クライアントが同じクライアント ID と永続サブスクリプション名を使用する場合に、クライアントがバスに接続する場所に関係なく、それらのクライアント間で作業を分散します。
共有しない
クライアントは、既存のセッションと同じクライアント ID と永続サブスクリプション名を使用できません。