共有サブスクリプション (Shared Subscription) は、 JMS 2.0 で採用された最も重要な機能の 1 つです。
従来の JMS 1.1 における パブリッシュ - サブスクライブ モデルでは、トピックをサブスクライブ (購読) するすべてのサブスクライバー (コンシューマ) に同一のメッセージが配信されます。(下図参照)
|
通常の パブリッシュ - サブスクライブ モデル
|
ここで、受け取ったメッセージに対する処理がコンシューマ C1 とコンシューマ C2 では異なるものとします。
コンシューマ C2 におけるメッセージ処理にたいへん時間がかかるものと仮定します。次々とパブリッシュされるメッセージを滞りなく処理するためには、メッセージを並行して (あるいは複数で分散して) 処理したくなります。
この課題に対する JMS 1,1 のソリューションの 1つの例として下図のように間にキューを配置することが考えられます。
|
JMS 1.1 によるソリューション例
|
しかしながら、上図に示すソリューションでは、不都合が生じてしまいます。例えば、
- キューを配置することによるトポロジーの複雑化とそれに伴うシステム管理の負荷増大
- トピックから直接メッセージを受け取るのではなくキューを経由することによる配信パフォーマンスの低下
- 実際にトピックをサブスクライブするコンシューマの実数が把握できない
などが挙げられます。
JMS 2.0 の共有サブスクリプションによって、1つのサブスクリプションに複数のコンシューマを指定できるようになり、上述の不都合を解消するかたちで、メッセージ処理のスケールアウトが可能になりました。(下図を参照)
|
|
共有サブスクリプションによるソリューションでは以下の利点を得ることができます。
- すべてのコンシューマがトピックから直接メッセージを受け取れる -- パフォーマンスの低下を招かない
- キューの追加など新たなリソースを必要としない -- システム管理の負荷増大を招かない
|