【问题标题】:Spring AMQP - concurrent publishing to RabbitMQ Broker seems to blockSpring AMQP - 并发发布到 RabbitMQ Broker 似乎阻塞
【发布时间】:2016-09-05 12:33:58
【问题描述】:

我有一个小型 Spring Boot 应用程序,它充当某些队列的生产者。它使用以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version>1.4.0.RELEASE</version>
</dependency>

在应用程序中,我启动了 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)

所以在我看来,这不像是并行发布。

谁能判断这种行为是否正确?对我来说似乎不是,但我不知道出了什么问题。

如果我在另一台机器上启动同一个生产者应用程序,阻塞状态似乎会变得更糟,好像 rabbitmq 代理正在同步访问。经纪人本身很好。没有物理限制。没有流量控制。使用额外的生产者应用程序,即使是传入消息速率也几乎翻了一番。

这对我来说没有任何意义。有人有想法吗?我需要担心吗?

提前致谢!

【问题讨论】:

  • 对此有什么结论吗?我想我也遇到了同样的问题

标签: spring multithreading rabbitmq


【解决方案1】:

可能是这个问题:

https://groups.google.com/forum/#!topic/rabbitmq-users/15cv2qroCps

我也遇到过,这个功能是原因:

RabbitMQ 服务器检测安装在 计算机启动时和 rabbitmqctl set_vm_memory_high_watermark 分数被执行。默认情况下,当 RabbitMQ 服务器使用上述 已安装 RAM 的 40%,它会发出内存警报并阻止所有 正在发布消息的连接。

因此,如果您增加此阈值/向机器添加内存,则可以修复它。

http://www.rabbitmq.com/memory.html

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多