RabbitMQ消息消费者不再使用消息

问题描述:

我们的团队正在Spike Sprint中进行ActiveMQ或RabbitMQ之间的选择。我们做了2个小生产者/消费者尖峰,发送一个包含16个字符串,时间戳和2个整数的对象消息。我们的开发机器上的尖峰状况良好(消息消耗良好)。RabbitMQ消息消费者不再使用消息

然后来到板凳。我们首先注意到,在我们的机器上,当我们发送大量消息时,消费者有时会挂断。它在那里,但消息堆积在队列中。

当我们去在板凳上。平台:

集群
  • 2 RabbitMQ的机器4芯/ 3.2Ghz的,4GB RAM,负载由VIP在RabbitMQ的机器上运行
  • 至6之一的消费者平衡,将消息保存在一个mysql数据库中(DB的机器类型相同)
  • 12个生产者运行在12台AS机器(tomcat)上,运行在另一台机器上的jmeter攻击。在产生相同负载的RabbitMQ消息的servlet上,每秒的负载约为600到700个http请求。

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

在此期间,生产者没问题,仍然以jmeter的速度生产(约600 msg/sec)。消息仍在队列中,消费者仍然是“活着”的。

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

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

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

谢谢你的回答。

+0

这可能更适合于serverfault。 – danben 2010-07-19 20:25:37

+0

谢谢,我会将它张贴在serverfault中。 – 2010-07-19 20:37:30

+0

奇怪的是,没有提到版本。例如,Ubuntu和Debian倾向于打包旧版本的东西,但是当这些东西是一个处于积极开发阶段的关键工具时,比如RabbitMQm,最好运行更新的版本。 – 2011-06-11 06:26:50

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

channel.basicQos(100); 

,以便在channel.basicConsume前行,以确保您永远不会有 邮件超过100封在QueueingConsumer排队。

+0

你能再详细一点吗?此设置如何帮助解决丢失的邮件问题?谢谢。 – Kimi 2010-07-28 12:04:19

+3

好,根据这个问题,消息不会丢失,消费者似乎*停止处理更多的消息。通过basicQos设置,它可以防止消费者在其他消费者获取消息之前预取大量消息。通过无限预取,如果不能同时启动所有消费者,则第一个消费者可以预取大量消息。这些预取消息不会被传送给其他消费者 – 2010-07-28 12:19:34

+0

@Al Bundy我并不是说消息丢失了,但有些消费者没有消费任何消息。消息在队列中并且不会丢失。 – 2010-07-28 12:50:02

我在使用RabbitMQ STOMP插件时看到了这种行为。我还没有找到解决方案。

你在使用STOMP插件吗?

+0

感谢您的回复。 不,我们不。你看到有没有STOMP插件的区别? – 2010-07-26 06:55:59

+0

我遇到了STOMP适配器的问题,但并非没有。 – Seb 2010-07-26 22:44:29

+0

链接被破坏 – 2012-03-23 07:46:57

+2

它现在可以在https://github.com/0x6e6562/hopper/blob/master/Work%20Distribution%20in%20RabbitMQ.markdown – spiffyman 2012-04-10 02:58:42

+0

链接中更正 – 2015-01-29 10:27:12

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