1) 主に、Spring JMS のオーバーヘッドは、JmsTemplate を使用して、下にキャッシュメカニズムなしでメッセージを送信することです。基本的に、JmsTemplate は送信するメッセージごとに次のことを行います。
- 接続を作成
- セッションの作成
- プロデューサーの作成
- メッセージを作成
- メッセージを送る
- セッションを閉じる
- 接続を閉じる
これは、再利用する手動で記述されたコードと比較できます。
- 接続を作成
- セッションの作成
- プロデューサーの作成
- メッセージを作成
- メッセージを送る
- メッセージを作成
- メッセージを送る
- メッセージを作成
- メッセージを送る
- セッションを閉じる
- 接続を閉じる
接続、セッション、およびプロデューサーの作成には、クライアントと JMS プロバイダー間の通信、およびもちろんリソースの割り当てが必要であるため、多数の小さなメッセージに対してかなり大きなオーバーヘッドが発生します。
これは、JMS リソースをキャッシュすることで簡単に回避できます。たとえば、Spring CachingConnectionFactoryまたは ActiveMQs PooledConnectionFactoryを使用します (この質問にタグを付けた ActiveMQ を使用している場合)。
完全な JavaEE コンテナ内で実行している場合、JNDI 接続ファクトリを取得するときにプーリング/キャッシングが組み込まれていることが多く、暗黙的に行われます。
Spring の Default Message Listening Container を使用して受信する場合、Spring にはオーバーヘッドがほとんど追加されない可能性のある薄いレイヤーがありますが、主な側面は、同時実行性などの点でパフォーマンスを微調整できることです。この記事ではそれについて非常によく説明されています。
2)
PubSub は、パブリッシャーがどのサブスクライバーが存在するかを知る必要がない使用パターンです。p2p でそれを単純にエミュレートすることはできません。そして、何の証拠もありませんが、あるアプリケーションから他の 10 個のアプリケーションに同じメッセージを送信したい場合、メッセージを p2p で 10 回送信するよりも、pub-sub セットアップの方が高速であると主張します。
一方、プロデューサーとコンシューマーが 1 つずつしかない場合は、代わりにキューを使用する P2P パターンを選択してください。いくつかの面で管理が簡単だからです。P2P (キュー) は負荷分散を可能にしますが、pub/sub では (簡単に) 不可能です。
ActiveMQ には、ハイブリッド バージョンのVirtualDestinationsもあります。これは、本質的に負荷分散に関するトピックです。
実際の実装はベンダーによって異なりますが、トピックとキューは根本的に異なるわけではなく、同様のパフォーマンスで動作するはずです。代わりにチェックする必要があるのは次のとおりです。
- 持続性?(=遅い)
- メッセージセレクター? (=遅い)
- 同時実行性?
- 永続的なサブスクライバー? (=遅い)
- リクエスト/リプライ、一時キューと「同期的に」 (= オーバーヘッド = 遅い)
- キューのプリフェッチ (= いくつかの点でパフォーマンスに影響します)
- キャッシング