我一直在尝试使用RabbitMQ perl库Net :: RabbitFoot,它下面使用AnyEvent :: RabbitMQ。根据RabbitMQ Tutorial,将prefetch_count设置为1应该确保公平分派,因为不应该向已经忙于另一条消息的工作人员发送消息。但是,perl实现Net::RabbitFoot,即使在设置qas后也没有那样工作,如描述here,第54行。它似乎只是做香草循环调度并最终调度到已经执行工作的机器。这是qos的实现。你能帮我弄清楚为什么会这样吗?这是库中的错误吗?
提前致谢。
编辑:
这是我的设置:2个消费者连接到同名队列。当我发送大量消息时,我看到这种模式:消费者1:Msg1,Msg3,Msg5 ......消费者2:Msg2,Msg4,......所有消息都来自同一个队列。现在发生的事情是,如果Msg3占用消费者1,仍然将Msg5发送给消费者1,而消费者2则免费。
香草循环?呃?
当许多使用者连接到同一个公共队列时,prefetch_count = 1会很有用。实际上,默认情况下,客户端库将一次性预取许多消息。
因此,您希望通过将其设置为1来避免的默认奇数效果是,一个客户端获得大部分(或全部)消息,而其他消费者获得很少或没有,因为负载不平衡。
但是你说的是“vanilla round-robin”:当你有一个连接到直接交换的不同(可能是未命名的/临时的)队列时,就会发生这种情况,每个消费者一个。但是通过这种方式,您无法动态平衡负载。
如果我猜对了,您需要更改配置并让所有使用者连接到同一个命名队列。
编辑:从OP的评论来看,情况并非如此。
或者,您的消费者可能配置了auto-ack,或者他们确实在完成工作之前发送了ACK。在这种情况下,RabbitMQ客户端API也认为可以免费获取另一条消息:只有在完成有关该消息的本地任务后才需要发回确认。