[英]RabbitMQ (Java) multiple consumers performance issue
我正在执行一项日常工作,该工作从MongoDB(大约30万个文档)中获取数据,并针对每个文档在RabbitMQ队列上发布消息。 另一方面,我在同一个队列中有一些使用者,理想情况下,它们应该并行工作。
一切都在正常运行,但没有我做的那么多,特别是在消费者表现方面。
这就是我声明队列的方式:
rabbitMQ.getChannel().queueDeclare(QUEUE_NAME, true, false, false, null);
这是完成发布的方式:
rabbitMQ.getChannel().basicPublish("", QUEUE_NAME, null, body.getBytes());
因此,用于声明队列的通道用于发布所有消息。
这是在for循环中实例化使用者的方式(总共10个,但可以是任何数字):
Channel channel = rabbitMQ.getConnection().createChannel();
MyConsumer consumer = new MyConsumer(customMapper, channel, subscriptionUpdater);
channel.basicQos(1); // also tried with 0, 10, 100, ...
channel.basicConsume(QUEUE_NAME, false, consumer);
因此,我为每个消费者创建了一个新渠道,并通过日志确认了这一点:
...
com.rabbitmq.client.impl.recovery.AutorecoveringChannel@bdd2027
com.rabbitmq.client.impl.recovery.AutorecoveringChannel@5d1b9c3d
com.rabbitmq.client.impl.recovery.AutorecoveringChannel@49a26d19
...
据我从很短的RabbitMQ经验中了解到的那样,这应该可以确保所有使用者都被调用。 顺便说一下,消费者需要0.5到1.2秒才能完成任务。 我刚刚发现了很少的3秒。
我有两个单独的队列,我重复以上两次(使用相同的RabbitMQ连接)。
因此,我已经测试了为每个队列发布100条消息。 他们两个都有10个qos = 1的消费者。
我没想到交付/消费性能会完全达到10 / s,相反,我注意到:
我是否缺少RabbitMQ中线程化的主要概念? 还是可能仍为默认值的任何特定配置? 几天以来我一直在研究它,所以这可能成为可能。
请注意,我处于可以控制发布和使用部分的幸运的位置:)
我在本地使用RabbitMQ 3.7.3,因此它不可能是任何网络延迟问题。
谢谢你的帮助!
最终,RabbitMQ渠道和消费者的设置是正确的:因此,每个消费者一个通道。
问题是让使用者调用同步方法来查找和更新MongoDB文档。
这延迟了某些使用者的执行时间:更糟糕的是,我添加的使用者越多(考虑加快处理速度),得到的消息速率就越低。
我已经将MongoDB的一部分移到了他的发布端,在这里我不必关心同步,因为它仅由一个发布者按顺序完成。 我的传输速度略有降低,但现在只有5个消费者,我的响应速度很容易达到50-60 / s。
得到教训:
作为基本规则:
这将为您提供一个初始qos值,以根据您的方案进行测试和调整。 最终目标是使所有可用消费者的利用率达到100%。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.