我构建了一个应用程序,该应用程序由一个发布者,几个队列和每个队列的多个使用者组成。队列(包括队列)上的使用者共享通道。其他队列使用其他通道。我观察到,对于不同的队列,正在并行处理任务,但是对于特定的队列却没有发生。如果我一次将多个消息发布到特定队列,则只有一个使用者工作,而其他使用者则等到工作结束。为了使消费者能够并行工作,我该怎么办?
workers.each do |worker|
worker.on_delivery() do |delivery_info, metadata, payload|
perform_work(delivery_info, metadata, payload)
end
queue.subscribe_with(worker)
end
这是我为特定队列注册所有使用者的方式。 perform_work(_,_,_)
操作非常昂贵,需要几秒钟才能完成。
答案 0 :(得分:0)
RabbitMQ脱离channels
概念的支持,并且通常旨在不在线程之间共享通道。此外,默认情况下,通道的工作线程池大小为1。频道是会话的模拟。
在您的情况下,您有多个使用者共享队列和通道,并在该通道的事件处理程序中执行长时间的工作。
有两种方法可以解决此问题:
我建议每个消费者使用1个频道,因为它引起意外副作用的可能性较低。