Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高负载下RabbitMQ使用者利用率为零_Rabbitmq_Spring Amqp_Spring Rabbit - Fatal编程技术网

高负载下RabbitMQ使用者利用率为零

高负载下RabbitMQ使用者利用率为零,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我们使用基于spring amqp的侦听器容器——大约有40个使用者,预取计数为1。消息ttl在到达死信队列之前大约60秒 每个使用者执行的操作都是数据库更新,这比消息到达队列的速度慢 经过一段时间后,队列中堆积的消息数量—消费者利用率降至零。我的印象是消费者被数据库屏蔽了。但是,如果我查看线程转储,所有使用者都在rabbit mq上处于等待状态-没有消息被处理 "SimpleAsyncTaskExecutor-7" #51 prio=5 os_prio=0 tid=0x00007fcb

我们使用基于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)
“SimpleAsynctaskeExecutor-7”#51 prio=5 os_prio=0 tid=0x00007fcb01ad0800 nid=0x58f7等待条件[0x00007fcae5af1000]
java.lang.Thread.State:定时等待(停车)
在sun.misc.Unsafe.park(本机方法)
-停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
位于java.util.concurrent.locks.LockSupport.parknos(LockSupport.java:215)
位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
位于java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
位于org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.nextMessage(BlockingQueueConsumer.java:390)
位于org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1097)
位于org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1086)
位于org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1100(SimpleMessageListenerContainer.java:93)
位于org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1203)
运行(Thread.java:745)
队列也进入流状态

不确定队列消息处理停止的原因。我理解它的发布受到限制


任何建议都会有帮助。

我不知道如何回答“建议”,所以我建议:)

以下是几点建议:

  • 增加消费者数量
  • 增加预取限制
现在,我不能告诉你什么值,确切地说,这需要微调。你也可以试着用这些东西中的一个或两个。也许可以让你大致了解如何开始(即什么值)

此外,您还可以将其放大,以便将队列镜像到集群中的多个节点,并使用其中的消息


也检查一下。信用流和消息分页看起来也可以尝试。

我不太熟悉Spring AMQP,但预取计数1听起来非常低(例如,我过去使用的另一个库的默认值为50)。这有什么原因吗?你有没有尝试过不同的价值观?增加预取计数通常是提高单个消费者利用率的方式,因为实际上是给每个消费者“更多的工作”去做。此外,我们在这里讨论的消息量(例如每秒)是多少?消息速率>700/秒。我用PreTech做过实验,但问题是队列关闭。此外,对于我拥有的所有通道,我只有一个到rabbit的TCP连接。这是一个限制因素吗?根据我的经验,一个TCP连接通常就足够了。这些消息的平均大小是多少?您处理的是单个RMQ实例还是集群(如果是,队列是否跨一个或多个节点镜像?)。您的RMQ实例是磁盘节点还是RAM节点?队列是否持久?还有,你读过这篇博文吗?关于是什么导致流控制机制被激活,有很多有用的信息。另一个想法是,您的数据库是否对这些更新使用任何类型的锁定机制?我想知道你拥有的消费者数量是否是问题的一部分——如果他们都试图同时获得相同种类的锁,与数量较少的消费者相比,你可能会对整体消息吞吐量产生负面影响。谢谢。我认为您提到的这些问题的组合是存在的。另外,我认为,如果队列的消息接收率很高,那么所有资源都花在了与发布者打交道上,让消费者感到枯燥——可能就是这样。无论如何,我都会努力加快处理速度。