我目前正在使用spring AMQP API连接到RabbitMQ。基本上在我的消费者代码中,我正在异步读取消息并在弹性搜索中进行批量插入。当我做ack = AUTO时,我获得400-500 msg / sec的中等速度(从队列中读取)。当我执行ack = NONE时,读取速度的增加很大,即达到5000-6000 msg / sec。
配置如下:
-server
-Xms1g -Xmx1g -Xss384k PermSize=256m MaxPermSize=256m
现在的问题是,当我正在做ack = NONE虽然我的速度很快,JVM在一段时间后得到OutOfMemory,我可以看到很多GC正在这种情况下发生。
我打算使用Spring集成的QueueChannel,我可以将通道的大小限制为它可以包含多少消息。
如何使用RabbitMQ实现这一点还有没有其他方法可以实现4000-5000 msg /秒的良好读取速度而不会崩溃JVM?
答案 0 :(得分:1)
尝试使用ack=AUTO
,但请设置prefetch
和txSize
,比如1000;这样,每1000条消息就会发送一次确认(你可以根据需要调整这个值)。
使用ackmode = NONE会导致消息在侦听器容器内的无限制阻塞队列中累积,并且只有在侦听器可以跟上时才会起作用(OOM意味着您不能)。
我们有一个open JIRA issue来解决这个问题,因为ack = NONE,但上述技术通常就足够了。
您还可以使用容器并发设置来提高吞吐量。