8

私たちのチームは、ActiveMQまたはRabbitMQのどちらかを選択するための急上昇中です。16個の文字列の配列、タイムスタンプ、および2つの整数を含むオブジェクトメッセージを送信する2つの小さなプロデューサー/コンシューマースパイクを作成しました。スパイクは開発者のマシンでは問題ありません(メッセージは十分に消費されています)。

それからベンチが来ました。私たちのマシンでは、多くのメッセージを送信しているときに、消費者が時々ぶら下がっていることに最初に気づきました。そこにありましたが、メッセージがキューに蓄積されていました。

ベンチプレートフォームに行ったとき:

  • 2台のrabbitmqマシンのクラスター4コア/3.2Ghz、4Gb RAM、VIPによる負荷分散
  • 1〜6人のコンシューマーがrabbitmqマシンで実行され、メッセージをmysql DB(DBと同じタイプのマシン)に保存します。
  • 12台のASマシン(tomcat)で実行されている12人のプロデューサーが、別のマシンで実行されているjmeterで攻撃されました。同じ負荷のRabbitMQメッセージを生成するサーブレットでは、負荷は1秒あたり約600〜700のhttpリクエストです。

時々 、消費者がハングすることに気づきました(まあ、彼らはブロックされていませんが、彼らはもうメッセージを消費しません)。各コンシューマーがデータベースに約100msg/秒を保存するため、消費を停止すると、DBに保存される1秒あたりのメッセージ全体が同じ比率で減少することがわかります(たとえば、3人のコンシューマーが停止すると、約600msgに減少します。 /秒から300msg/秒)。

その間、プロデューサーは問題なく、jmeterレート(約600msg /秒)でプロデュースします。メッセージはキューにあり、まだ「生きている」消費者によって受け取られます。

最初にすべてのサーブレットをプロデューサーにロードしてから、すべてのコンシューマーを1つずつ起動し、接続に問題がないかどうかを確認してから、jmeterを実行します。

1つの直接取引所にメッセージを送信しています。すべてのコンシューマーは、交換にバインドされた1つの永続キューをリッスンしています。

その点が私たちの選択にとって重要です。これをrabbitmqで見たことがありますか?何が起こっているのかわかりますか?

ご回答ありがとうございます。

4

4 に答える 4

4

basic.consumeを使用する場合は、プリフェッチカウントを設定する価値があります。

channel.basicQos(100);

QueueingConsumerに100を超えるメッセージがキューに入れられないようにするために、channel.basicConsume行の前。

于 2010-07-28T11:59:40.390 に答える
2

QoSの説明については、この優れたブログエントリを参照してください。

https://github.com/0x6e6562/hopper/blob/master/Work%20Distribution%20in%20RabbitMQ.markdown

于 2010-11-05T14:14:39.777 に答える
1

RabbitMQ STOMPプラグインを使用すると、この動作が見られます。私はまだ解決策を見つけていません。

STOMPプラグインを使用していますか?

于 2010-07-26T00:26:07.570 に答える
0

RabbitMQのチャネルはスレッドセーフではありません。したがって、スレッド要求がないかコンシューマーチャネルをチェックインします。

于 2010-11-18T11:59:34.580 に答える