RabbitMQ向消费者不均匀地分发消息

时间:2016-06-09 08:12:30

标签: rabbitmq message-queue

我们遇到的问题是,我们的消息队列的消费者正在从字母范围顶部的队列中获取消息。我们有两个应用程序: producer 订阅者。我们正在使用 RabbitMQ 3.6.1

假设消息队列的设置如下:

Fig A

我们的第一个应用程序 producer ,每秒对每个队列说100条消息:

Fig B

我们的第二个应用程序订阅者有五个唯一的消费者方法,可以处理每个相应队列上的消息。每个方法都绑定到它的相应队列。 订户的预取值为1意味着它一次只能容纳一条消息,而不管队列如何。我们可以像这样运行订户的大量实例:

Fig C

因此情况如此:每个队列正在接收100 msg / sec,并且我们有四个 subscriber 实例消耗这些消息,因此每个队列有四个消费者。假设消费者方法可以处理每个25 msg /秒。

所发生的是,不是所有队列被平等消耗,而是按字母顺序排列更高的队列而不是优先级。似乎当订户准备就绪时, RabbitMQ 向下查看此特定就绪通道所绑定的队列列表,并选择具有待处理消息的第一个队列。 / p>

在我们的情况下,A_QUEUE将消耗所有消息。 B_QUEUE可能会在某些竞争条件下消耗掉一些,但C_QUEUE / D_QUEUE尤其是E_QUEUE很少被触及。

如果我们关闭发布商,队列最终会从上到下排空。

是否可以配置 RabbitMQ 本身,甚至可能配置使用某种循环分发策略的频道,甚至可能使用随机策略,以便在频道有多个绑定队列时,所有消息都悬而未决,分布是否均匀?

2 个答案:

答案 0 :(得分:2)

澄清一下:你有一个包含多个消费者的单一订阅者应用程序,对吗?

我猜你在订阅者应用中使用了一个RabbitMQ连接。

您是否也为所有消费者重复使用单个RabbitMQ频道?如果是这样,那将是一个问题。请务必为您开始的每个消费者使用新的频道。

答案 1 :(得分:1)

也许图片是错误的,但如果没有,那么你的设置是错误的。如果您要让订阅者监听每个队列,则不需要4个队列。您只需要一个队列,该队列有多个同一订户的实例从中消耗。

现在回答,是(但不需要配置,只要预取为1),实际上rabbitmq会均匀地分发消息。你可以找到关于那个here的信息,并且在同一个地方实际上你的设置应该是什么样子。以下是该链接的引用。

  

当消息进入队列时,RabbitMQ只会调度一条消息。   它没有查看a的未确认消息的数量   消费者。它只是盲目地向第n个发送每个第n个消息   消费者。