2

複数のプロデューサーからメッセージを受信する単一の「ポイント ツー ポイント」IBM MQ キューがあります。私のアプリケーションは、キューからのメッセージを消費します。メッセージを非同期的に消費するために、春の「jmstemplate」と「DefaultMessageListenerContainer」を使用しています。

私のアプリケーションは 2 つの jvm で実行されています。つまり、同じキューをリッスンしている各 jvm でアクティブなリスナーが 2 つあります。

私の質問に来て、メッセージが届いたら...

1) リスナーは、メッセージがキューに到着したことをどのように認識しますか?

2) 2 人のリスナーのうち、メッセージを受け取るのはどちらですか? メッセージをリスナーに配信するためのアプローチは何ですか?

3) 単一のキューに対して「N」個のリスナーにスケーリングできますか? リスナーが 10 人に増えた場合、スケーリングはどのように機能しますか? メッセージはどのようにリスナーに配信されますか?

4) MQ サーバーは、同じメッセージが複数のリスナーに送信されないようにするにはどうすればよいですか?

これらは単純な質問かもしれませんが、上記のシナリオがどのように機能するかを掘り下げることはできません. あなたの考えを共有してください...

4

1 に答える 1

5
  1. これは IBM クライアント ライブラリの機能です。リスナー コンテナはメッセージを待機する JMS API をポーリングするだけです。デフォルトでは、1 秒の受信タイムアウトを使用します。TRACE レベルのロギングでは、このアクティビティを示すログ メッセージが表示されます。タイムアウトは、コンテナーで receiveTimeout を設定することによって変更できます。
  2. これは、クライアントの観点からは不確定です。IBM ブローカーは、登録されているコンシューマーの数を認識し、1 つを選択します。一部のブローカーでは、プリフェッチの構成が許可されています。これにより、大音量ではパフォーマンスが向上しますが、小音量ではパフォーマンスが低下する可能性があります。
  3. はい; Spring Listener Container は、負荷に基づいてリスナーを動的にスケーリングできます。最小/最大コンシューマーを構成でき、Spring は必要に応じてそれらの境界内で調整します。ブローカーに関する限り、各リスナーは個別のコンシューマーであるため、ブローカーのアルゴリズムに従って作業が分散されます。
  4. これは、IBM ブローカー (および JMS コントラクトの一部) の機能です。

トランザクションを使用していて、メッセージがキューにロールバックされる場合。同じリスナーが再配信されたメッセージを受け取るという保証はありません。

于 2012-11-07T23:04:39.030 に答える