繁体   English   中英

RabbitMQ(Java)多个使用者性能问题

[英]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,相反,我注意到:

  • 实际值约为0.4和1.0。
  • 至少所有绑定到队列的使用者都收到了一条消息,但是看起来不像是“公平调度”。
  • 花了大约3分钟30秒来消耗两个队列中的所有消息。

在此处输入图片说明 在此处输入图片说明

我是否缺少RabbitMQ中线程化的主要概念? 还是可能仍为默认值的任何特定配置? 几天以来我一直在研究它,所以这可能成为可能。

请注意,我处于可以控制发布和使用部分的幸运的位置:)

我在本地使用RabbitMQ 3.7.3,因此它不可能是任何网络延迟问题。

谢谢你的帮助!

最终,RabbitMQ渠道和消费者的设置是正确的:因此,每个消费者一个通道。

问题是让使用者调用同步方法来查找和更新MongoDB文档。

这延迟了某些使用者的执行时间:更糟糕的是,我添加的使用者越多(考虑加快处理速度),得到的消息速率就越低。

我已经将MongoDB的一部分移到了他的发布端,在这里我不必关心同步,因为它仅由一个发布者按顺序完成。 我的传输速度略有降低,但现在只有5个消费者,我的响应速度很容易达到50-60 / s。

得到教训:

  • 为发布者创建一个单独的渠道。
  • 为每个消费者创建一个单独的渠道。
  • 让RabbitMQ为使用者管理线程(->您可以在主线程上实例化它们)。
  • (如果可能)退回发布,以使队列有100%的时间与消费者打交道。
  • 为每个消费者渠道设置qos> 1。 但这实际上取决于您的方案和体系结构:您必须进行一些性能测试。

作为基本规则:

  • (1)计算/估计交货时间。
  • (2)计算/估计确认时间。
  • (3)计算/估计消费者时间。
  • qos =(1)+(2)+(3)/(3)

这将为您提供一个初始qos值,以根据您的方案进行测试和调整。 最终目标是使所有可用消费者的利用率达到100%。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM