0

我一直在尝试使用 RabbitMQ perl 库 Net::RabbitFoot,它在下面使用 AnyEvent::RabbitMQ。根据RabbitMQ Tutorial,将 prefetch_count 设置为 1 应该确保公平调度,因为不应该将消息发送给已经忙于处理另一条消息的工作人员。然而,perl 实现Net::RabbitFoot ,即使在设置了这里描述的 qos 后,似乎也不能以这种方式工作,第 54 行。它似乎只是进行香草循环调度并最终调度到已经执行的机器工作。这是qos实现。你能帮我弄清楚为什么会这样吗?这是图书馆的错误吗?

提前致谢。

编辑:

这是我的设置:2 个消费者附加到同名队列。当我发送大量消息时,我看到了这种模式:消费者 1:Msg1、Msg3、Msg5 ... 消费者 2:Msg2、Msg4、...所有消息都来自同一个队列。现在发生的情况是,如果 Msg3 占用了消费者 1,当消费者 2 空闲时,仍然将 Msg5 发送给消费者 1。

4

1 回答 1

2

香草循环赛?呃?

当有许多消费者连接到同一个公共队列时,prefetch_count=1 很有用。事实上,默认情况下,客户端库将一次性预取许多消息。

因此,您希望通过将其设置为 1 来避免的默认奇怪效应是,一个客户端获得大部分(或全部)消息,而其他消费者获得的消息很少或没有,这是负载不平衡的。

但是,您谈到“香草循环”:当您将不同的(可能未命名/临时的)队列附加到直接交换时,就会发生这种情况,每个消费者一个。但是通过这种方式,您无法动态平衡负载。

如果我猜对了,您需要更改配置并让所有消费者附加到同一个命名队列。

编辑:从 OP 的评论来看,情况并非如此。

或者,您的消费者可能配置了自动确认,或者他们确实在完成工作之前发送了 ACK。在这种情况下,RabbitMQ 客户端 API 也认为可以免费获取另一条消息:只有在有关该消息的本地任务完成后,您才需要发回 ack。

于 2014-04-02T21:15:27.690 回答