2016-10-06 10 views
1

spring amqpベースのリスナコンテナを使用します。消費者は約40人、プリフェッチ数は1です。メッセージttlはデッドレターキューに入る前に約60秒です。高負荷でのRabbitMQコンシューマ利用率ゼロ

各コンシューマが実行する操作はデータベース更新です。これは、メッセージがキューに到着する速度よりも遅くなります。

いつか後で、メッセージの数がキューに積み重なり、コンシューマの使用率がゼロまで低下しました。私は消費者がデータベースでブロックされているという印象を受けました。しかし、私がスレッドダンプを見ると、すべてのコンシューマがウサギmqの待機状態にあり、メッセージは処理されません。

"SimpleAsyncTaskExecutor-7" #51 prio=5 os_prio=0 tid=0x00007fcb01ad0800 nid=0x58f7 waiting on condition [0x00007fcae5af1000] 
    java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x00000000854c30c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) 
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467) 
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.nextMessage(BlockingQueueConsumer.java:390) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1097) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1086) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1100(SimpleMessageListenerContainer.java:93) 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1203) 
    at java.lang.Thread.run(Thread.java:745) 

キューもフロー状態になります。

なぜキューメッセージ処理が停止するのかわかりません。私はそれが制限されていることを公開することを理解しています

提案があれば助かります。

+0

私はSpring AMQPに特に精通していませんが、1のプリフェッチカウントは非常に低いです(過去に使用していた別のライブラリのデフォルト値は50です)。これには理由があったのですか、さまざまな価値観で実験しましたか?プリフェッチ回数を増やすことは、基本的に個々の消費者の利用を増やす方法です。また、どのくらいの量のメッセージ(たとえば、1秒あたり)をここで話していますか? – Donut

+0

メッセージレートは1秒あたり> 700です。私はprefechで実験しました - しかし、キューが閉鎖されているのは問題です。また、私は私が持っているすべてのチャネルのウサギへのTCP接続を1つしか持っていません。それは制限要因ですか? – Srikanth

+0

私の経験では通常、単一のTCP接続で十分です。これらのメッセージの平均サイズはどれくらいですか?単一のRMQインスタンス、またはクラスタを扱っていますか?そうであれば、1つ以上のノードにまたがってキューがミラー化されていますか? RMQインスタンスはディスクノードまたはRAMノードですか?キューは永続的ですか?また、このブログ記事を読んでいますか? http://www.rabbitmq.com/blog/2014/04/14/finding-bottlenecks-with-rabbitmq-3-3/フロー制御メカニズムを引き起こしている可能性のあるものには、非常に多くの有益な情報があります。活性化する。 – Donut

答えて

0

私はSOの「提案」に答える方法を決して確信しているので、私はここで

は、提案のカップルです:)お勧めします:

  • は、消費者の数を増やす
  • プリフェッチの上限を増やす

ここで、正確にはこれを微調整しなければならない値を教えていただけません。また、これらのいずれかまたは両方で試すこともできます。たぶんthis articleは、どのように開始するか(つまり、どのような値)に大まかなアイデアを与えるかもしれません。

さらに、スケールアップすることもできます。そのため、キューをミラー化してクラスタ内の複数のノードに合わせ、そこからメッセージを消費します。

this articleもチェックしてください。クレジット・フローは、メッセージ・ページングだけでなく、試してみることのできるもののように見えます。

関連する問題