RabbitMQ消费者在高负荷下利用率为零

时间:2016-10-06 01:40:36

标签: rabbitmq spring-amqp spring-rabbit

我们使用基于spring amqp的侦听器容器 - 大约有40个使用者,预取计数1.消息ttl在到达死信队列之前大约是60秒。

每个消费者执行的操作是数据库更新 - 比消息进入队列的速度慢。

一段时间后,消息利用率下降到队列中的消息数量减少到零。我的印象是消费者被阻止在数据库上。但是,如果我查看线程转储,所有消费者都在Rabbit 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)

队列也进入流状态。

不确定为什么队列消息处理已停止。我明白发布它是受限制的。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

我永远不知道如何回答关于SO的“建议”,所以我建议:)

以下是一些建议:

  • 增加消费者数量
  • 增加预取限制

现在,我无法告诉你什么价值,确切地说,这需要微调。您也可以尝试使用其中一种或两种。也许this article可以给你一个关于如何开始的粗略想法(即什么价值)。

此外,您还可以对其进行扩展,以便将队列镜像到群集中的几个节点,并使用此处的消息。

同时检查this article。信用流看起来像你也可以尝试的东西,以及消息分页。