RabbitMQ消息使用者停止使用消息

时间:2010-07-19 20:22:01

标签: benchmarking rabbitmq amqp

我们的团队处于尖峰冲刺阶段,可以在ActiveMQ或RabbitMQ之间进行选择。我们制作了2个小生产者/消费者峰值,发送一个包含16个字符串,时间戳和2个整数的数组的对象消息。我们的开发机器上的峰值是可以的(消息很好用)。

然后来了替补席。我们首先注意到,在我们的机器上,当我们发送大量消息时,消费者有时会挂起。它就在那里,但是这些消息在队列中累积。

当我们选择板凳时:

  • 2台Rabbitmq机器群集4核/ 3.2Ghz,4Gb RAM,由VIP负载均衡
  • 在rabbitmq机器上运行的一到六个消费者,将消息保存在mysql数据库(数据库的相同类型的机器)中
  • 在12台AS机器(tomcat)上运行的12台生产商,在另一台机器上运行jmeter攻击。在产生相同RabbitMQ消息负载的servlet上,每秒加载大约600到700个http请求。

我们注意到 有时 ,消费者挂起(好吧,他们没有被阻止,但他们不再消费消息了)。我们可以看到,因为每个消费者在数据库中节省了大约100 msg /秒,所以当一个人停止消费时,每秒在DB中保存的整体消息会以相同的比率下降(如果让3个消费者停止,我们会下降到大约600 msg /秒至300毫秒/秒)。

在此期间,生产商没问题,仍然以jmeter速率(约600 msg / sec)生产。消息在队列中并由消费者保持“活着”。

我们首先使用生产者加载所有servlet,然后逐个启动所有使用者,检查连接是否正常,然后运行jmeter。

我们正在向一个直接交换机发送消息。所有消费者都在监听与交易所有关的一个持久队列。

这一点对我们的选择很重要。你有没有看过Rabbitmq,你知道发生了什么吗?

感谢您的回答。

4 个答案:

答案 0 :(得分:4)

总值得 使用basic.consume时设置预取计数:

channel.basicQos(100);
在channel.basicConsume行之前

以确保你永远不会拥有 在QueueingConsumer中排队的消息超过100条。

答案 1 :(得分:2)

答案 2 :(得分:1)

答案 3 :(得分:0)

RabbitMQ中的通道不是线程安全的。 因此,请检查消费者渠道中的任何线程请求。