Mar*_*ndt 5 spring multithreading rabbitmq
我有一个小的 Spring Boot 应用程序,它充当某些队列的生产者。它使用以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在应用程序中,我启动了 4 个线程。在每个任务中创建最大大小为 10KB 的随机消息。这些消息使用 AmqpTemplate 中的 convertAndSend 方法发送到直接交换。对于每个线程,使用单独的通道。到目前为止,一切进展顺利。
在运行时,我使用 Java VisualVM 查看了 JVM。我可以看到 4 个线程在工作,但有点惊讶,这些线程大部分时间都处于监控(阻塞)状态。请参阅以下屏幕截图:
http://i.stack.imgur.com/i8uX7.png
这是堆栈跟踪的一部分:
java.lang.Thread.State: BLOCKED
at com.rabbitmq.client.impl.SocketFrameHandler.writeFrame(SocketFrameHandler.java:144)
- waiting to lock <1407a47> (a java.io.DataOutputStream) owned by "Thread-7" t@35
at com.rabbitmq.client.impl.AMQConnection.writeFrame(AMQConnection.java:514)
at com.rabbitmq.client.impl.AMQCommand.transmit(AMQCommand.java:102)
- locked <316a68> (a com.rabbitmq.client.impl.CommandAssembler)
at com.rabbitmq.client.impl.AMQChannel.quiescingTransmit(AMQChannel.java:334)
- locked <1d8e172> (a java.lang.Object)
at com.rabbitmq.client.impl.AMQChannel.transmit(AMQChannel.java:310)
- locked <1d8e172> (a java.lang.Object)
at com.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:657)
Run Code Online (Sandbox Code Playgroud)
所以这对我来说不像是并行发布。
谁能判断这种行为是否正确?对我来说似乎不是,但我无法弄清楚出了什么问题。
如果我在另一台机器上启动同一个生产者应用程序,阻塞状态似乎变得更糟,好像rabbitmq 代理正在同步访问。经纪人本身很好。没有达到物理限制。没有流量控制。使用额外的生产者应用程序,即使传入消息率也几乎翻了一番。
这对我来说没有任何意义。有没有人有想法?我需要担心吗?
提前致谢!
小智 1
大概这就是问题所在:
https://groups.google.com/forum/#!topic/rabbitmq-users/15cv2qroCps
我也遇到过,这个功能就是原因:
RabbitMQ 服务器在启动时以及执行rabbitmqctl set_vm_memory_high_watermarkfraction 时检测计算机中安装的 RAM 总量。默认情况下,当 RabbitMQ 服务器使用超过 40% 的已安装 RAM 时,它会发出内存警报并阻止所有正在发布消息的连接。
因此,如果增加此阈值/向计算机添加额外内存,则可以修复它。
http://www.rabbitmq.com/memory.html
| 归档时间: |
|
| 查看次数: |
529 次 |
| 最近记录: |