为RabbitMQ配置Spring Integration QueueChannel

时间:2013-09-25 14:45:17

标签: jvm rabbitmq spring-integration spring-amqp

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

配置如下:

  • 具有32GB RAM的Linux机器
  • JVM参数:

-server -Xms1g -Xmx1g -Xss384k PermSize=256m MaxPermSize=256m

现在的问题是,当我正在做ack = NONE虽然我的速度很快,JVM在一段时间后得到OutOfMemory,我可以看到很多GC正在这种情况下发生。

我打算使用Spring集成的QueueChannel,我可以将通道的大小限制为它可以包含多少消息。

如何使用RabbitMQ实现这一点还有没有其他方法可以实现4000-5000 msg /秒的良好读取速度而不会崩溃JVM?

1 个答案:

答案 0 :(得分:1)

尝试使用ack=AUTO,但请设置prefetchtxSize,比如1000;这样,每1000条消息就会发送一次确认(你可以根据需要调整这个值)。

使用ackmode = NONE会导致消息在侦听器容器内的无限制阻塞队列中累积,并且只有在侦听器可以跟上时才会起作用(OOM意味着您不能)。

我们有一个open JIRA issue来解决这个问题,因为ack = NONE,但上述技术通常就足够了。

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