1

WebSphere MQ 7を使用していますが、2つのクライアントが同じQMgrに接続されており、次のコードのように同じキューからメッセージを消費しています。

 while (true) {
        TextMessage message = (TextMessage) consumer.receive(1000);
        if (message != null) {
            System.out.println("*********************" + message.getText());
        }
    }

常にメッセージを取得するクライアントは1つだけでした。2つのクライアントで消費メッセージの負荷分散を行う方法はありますか?MQサーバー側の構成オプションはありますか?

4

2 に答える 2

3

キューハンドルを管理する場合、WMQがそれらをLIFOキューではなくスタックに配置する方がはるかに高速です。したがって、メッセージがメッセージの処理にかかる時間よりも遅くキューに到着した場合、インスタンスがメッセージを処理し、WMQがスタックにプッシュダウンする別のGETを実行する可能性があります。その結果、少量のユースケースでは1つのインスタンスのみにメッセージが表示されます。

メッセージを待機しているインスタンスが多数ある大規模な環境では、他のインスタンスがメッセージを枯渇させている間に、アクティビティがそれらのインスタンスの一部の間でラウンドロビンする可能性があります。たとえば、キュ​​ーに10個のGETterがある場合、3つの処理メッセージと7つのアイドル状態が表示されることがあります。

これはMQの場合はかなり高速ですが、内部でどのように機能するかを知らない顧客にとっては混乱を招くため、PMRを開いてこの正確な質問をします。IBMは、いくつかの選択肢の中から選択する必要がありました。

  • 完全にロードされたときのパフォーマンスのためにスタックで管理するためのいくつかのコードパスを追加します。これはコードを肥大化し、エラーを導入するための多くの新しい決定ポイントを追加し、信頼性やパフォーマンスではなく認識の1つであった問題を解決します。
  • それがどのように機能するかについて顧客を教育します。もちろん、一度文書化すると、変更することはできません。これを知ったのは、IMPACTでの「WMQInternals」プレゼンテーションに参加したことです。これはInfocenterにないため、IBMは変更できますが、お客様は利用できます。
  • 何もしない。これはコード設計の観点からは最良の結果ですが、動作は直感に反します。ユーザーは、物事が期待どおりに動作しない理由を理解する必要があり、目的の動作をもたらす構成を見つけようとしたり、PMRを開いたりするのに時間を浪費します。

それがまだこのように機能するかどうかはわかりませんが、機能することを期待しています。私がそれをテストするために使用した方法は、一度に多くのメッセージをキューに入れて、それらがどのように配布されたかを確認することでした。1つの作業単位で約50のメッセージをキューにドロップすると、2つのインスタンス間の分散が改善されるはずです。

一度に50個のメッセージをキューにドロップするにはどうすればよいですか?まず、アプリケーションをオフにして、またはスペアキューにそれらを生成します。それらをターゲット・キューで生成した場合は、Qプログラムを使用してそれらをスペア・キューに移動してください。次に、アプリを起動し、キューのIPPROC数が、起動したアプリのインスタンスの数と等しいことを確認します。再度Qを使用して、すべてのメッセージを1つの作業単位で元のキューにコピーします。それらはすべて一度にキューで使用可能になるため、2つのアプリインスタンスの両方にすぐにメッセージが渡されるはずです。移動の代わりにコピーを使用した場合は、必要に応じてこれを繰り返すことができます。

于 2012-12-10T17:54:44.347 に答える
0

クライアントはあまり機能していないため、1つのインスタンスで全負荷を処理できる可能性があります。より現実的なワークロードを実装してみてください。または、もっと簡単に、クライアントにThread.sleepを配置してください。

于 2012-12-10T12:36:07.497 に答える