非同期 JMS メッセージング システム用の同期 HTTP 要求応答フロント エンドがあります。
各 HTTPRequest の HTTP クエリ サーブレットは、対応する JMS メッセージをクエリ キューに作成します。このクエリはバックエンドによって処理され、このクエリに対していくつかの応答メッセージが作成されます。JMS で応答メッセージの受信を整理し、それらが適切なサーブレット スレッドに到達して HTTPResponse を作成できるようにするための適切な方法は何ですか?
クエリと応答は非トランザクションであり、永続化する必要はありません。それらのほとんどは読み取りクエリです。45 秒以内に応答が読み取られない場合、サーブレットはタイムアウト応答を生成します。ただし、スループットは重要です。ますます多くのクエリを処理する必要があります。このシステムは約 10 年前のもので、あと 2 年ほど稼働し続ける必要があります。
SonicMQ を使用しています。すべての応答に対して 1 つのキューを作成しました。サーブレット コンテナーには、読み取りと書き込みの両方に使用するブローカーへの接続が 1 つあります。ログインしたユーザーごとに 1 つのリスナー スレッドを生成します (約 1500 の同時実行)。このスレッドには、この特定のユーザーの応答メッセージのみを選択するメッセージ セレクターを備えた受信機があります。サーブレット スレッドがクエリ メッセージを送信すると、ユーザーのリスナー スレッドが応答を読み取ったことを通知するまで待機します。
以前は、すべての送信者とすべての受信者が 1 つの QueueSession を共有していました。セッションは公式にはスレッドセーフではありませんが、これは実際に機能しました(!)。スレッド (サーブレット スレッドとリスナー スレッド) ごとに 1 つの QueueSession を作成すると、パフォーマンスがいくらか改善されましたが、それでもまだ安定していません。
メッセージセレクターを備えた単一のキューではなく、ユーザーセッションごとに一時キューを作成しようとしましたが、かなり遅くなりました。
これを整理するためのより良い/適切な方法は何でしょうか?