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)
キューもフロー状態になります。
なぜキューメッセージ処理が停止するのかわかりません。私はそれが制限されていることを公開することを理解しています
提案があれば助かります。
私はSpring AMQPに特に精通していませんが、1のプリフェッチカウントは非常に低いです(過去に使用していた別のライブラリのデフォルト値は50です)。これには理由があったのですか、さまざまな価値観で実験しましたか?プリフェッチ回数を増やすことは、基本的に個々の消費者の利用を増やす方法です。また、どのくらいの量のメッセージ(たとえば、1秒あたり)をここで話していますか? – Donut
メッセージレートは1秒あたり> 700です。私はprefechで実験しました - しかし、キューが閉鎖されているのは問題です。また、私は私が持っているすべてのチャネルのウサギへのTCP接続を1つしか持っていません。それは制限要因ですか? – Srikanth
私の経験では通常、単一のTCP接続で十分です。これらのメッセージの平均サイズはどれくらいですか?単一のRMQインスタンス、またはクラスタを扱っていますか?そうであれば、1つ以上のノードにまたがってキューがミラー化されていますか? RMQインスタンスはディスクノードまたはRAMノードですか?キューは永続的ですか?また、このブログ記事を読んでいますか? http://www.rabbitmq.com/blog/2014/04/14/finding-bottlenecks-with-rabbitmq-3-3/フロー制御メカニズムを引き起こしている可能性のあるものには、非常に多くの有益な情報があります。活性化する。 – Donut