0

このアプリケーションでは、JMSトピックからメッセージを受信します。

  • まず、JMSがFIFOポリシーに従っているかどうかを知りたいです。そうでない場合、アプリケーションはどのようにして最新のメッセージを判別できますか?

メッセージはトランザクションがコミット/終了するまでJMSサーバーに保持されるため、メッセージを消費します(永続サブスクライバーとJMSセッションはトランザクション処理され、多くのオーバーヘッドが発生します)。トランザクションを指定した理由は

  • キャッシング(休止)テクノロジーとそれを使用するトランザクションを使用しています。したがって、2つのトランザクションを使用しています。1つはJMS txで、もう1つはキャッシングテクノロジーtxです。メッセージを消費し、メッセージがコミットされて確認応答がJMSに送信されるまで、すべてまたは何も起こらないようにしたい場合。txをキャッシュすると、最初にコミットされ、すぐにJMS txが次にコミットされ、メッセージが確認されます。それ以外の場合は、両方のtxがロールバックされ、メッセージが再生されます。現在、メッセージを3回再生していますが、それでも例外が発生する場合は、メッセージを処理不可能なキューに送信しています。

  • これは、多くのメッセージが同時にJMSに届き、システムで同時に処理する必要があるまでは正常に機能します。

  • そのようなシナリオに遭遇したとき、あなたは何をしましたか?なぜなら、永続的なサブスクリプションとトランザクションセッションを維持することは、JMSサーバーよりも大きなオーバーヘッドであり、サーバーのパフォーマンスを低下させるからです。

4

1 に答える 1

1

トピックのメッセージ順序は JMS 仕様で指定されていないため、それに対する公式の回答は、JMS 実装固有であるというものです。そうは言っても、何か他のことをするために特にオーバーライドされない限り、メッセージは FIFO 順で配信されると思います。

トランザクションについては、2 フェーズ コミット XA トランザクションの実装を検討して、2 つの別個のトランザクションが必要ないようにすることをお勧めします。キャッシュの実装が XA をサポートしている場合、JMS とキャッシュ (および DB) のトランザクションはまったく同じになります。

一般に、これらのタイプのトランザクション メッセージで、トランザクション メッセージを使用する必要がある場合、パフォーマンスを絞り出す最善の方法は、1 つのトランザクションでできるだけ多くのメッセージを処理することであることがわかりました。

  1. 取引を開始する
  2. n 個のメッセージ (またはタイムアウトになるまですべてのメッセージ) を取得します。
  3. メッセージを処理する
  4. トランザクションをコミットします。
  5. 1 に移動します。

1 石で 2 羽の鳥を殺すもう 1 つの方法は、取得中のメッセージの処理をスキップし、取得したメッセージをトランザクション データ ストアに単純に書き込むことです。次に、別のスレッドでストアからメッセージを取得し (タイムスタンプの順序で)、それらを処理します (別のスレッド - = 別のトランザクション)。

于 2012-04-04T13:17:21.853 に答える