Jvm 为RabbitMQ配置Spring集成队列通道

Jvm 为RabbitMQ配置Spring集成队列通道,jvm,rabbitmq,spring-integration,spring-amqp,Jvm,Rabbitmq,Spring Integration,Spring Amqp,我目前正在使用spring AMQP API连接到RabbitMQ。基本上,在我的消费代码中,我异步读取消息,并在弹性搜索中进行批量插入。当我执行ack=AUTO时,我得到的中等速度为400-500 msg/秒(从队列读取)。当我执行ack=NONE时,读取速度会大幅提高,即达到5000-6000 msg/秒 配置如下: 具有32GB RAM的Linux计算机 JVM参数: -服务器 -Xms1g-Xmx1g-Xss384k PermSize=256m MaxPermSize=256m 现在

我目前正在使用spring AMQP API连接到RabbitMQ。基本上,在我的消费代码中,我异步读取消息,并在弹性搜索中进行批量插入。当我执行ack=AUTO时,我得到的中等速度为400-500 msg/秒(从队列读取)。当我执行ack=NONE时,读取速度会大幅提高,即达到5000-6000 msg/秒

配置如下:

  • 具有32GB RAM的Linux计算机
  • JVM参数:
-服务器
-Xms1g-Xmx1g-Xss384k PermSize=256m MaxPermSize=256m

现在的问题是,当我执行ack=NONE时,虽然我的速度很快,但JVM在一段时间后会从内存中消失,我可以看到在这个场景中发生了很多GC

我计划使用SpringIntegration中的QueueChannel,在这里我可以限制通道的大小,使其能够包含多少消息


我如何用RabbitMQ实现这一点还有没有其他方法可以在不破坏JVM的情况下达到4000-5000 msg/秒的良好读取速度?

尝试使用
ack=AUTO
,但将
预取
txSize
设置为1000;这样,每1000条消息只发送一次ack(您可以根据需要调整此值)

使用ackmode=NONE会导致消息在侦听器容器内的无限阻塞队列中累积,并且只有在侦听器能够跟上的情况下才会起作用(OOM表示您的消息不能跟上)

对于ack=NONE,我们有一个解决方案,但上述技术通常就足够了


您还可以使用容器并发设置来提高吞吐量。

我已经将预取计数设置为750,但我没有使用txSize:(这会产生什么影响?我还可以使用Spring与RabbitMQ集成的QueueChannel,因为它有大小限制等。
txSize
控制我们发送ACK的频率。它不是一个好的属性名称-它与事务无关。参考手册:“当与acknowledgeMode AUTO一起使用时,容器将尝试在发送ack之前处理多达此数量的消息(等待每个消息直到接收超时设置)。这也是在提交事务通道时。如果预取计数小于txSize,它将增加以匹配txSize。”。“。在这种情况下,使用SI QueueChannel没有帮助-内存使用在侦听器容器中。