RabbitMQ兔子平行消费

时间:2018-10-23 10:01:00

标签: ruby rabbitmq bunny

我构建了一个应用程序,该应用程序由一个发布者,几个队列和每个队列的多个使用者组成。队列(包括队列)上的使用者共享通道。其他队列使用其他通道。我观察到,对于不同的队列,正在并行处理任务,但是对于特定的队列却没有发生。如果我一次将多个消息发布到特定队列,则只有一个使用者工作,而其他使用者则等到工作结束。为了使消费者能够并行工作,我该怎么办?

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(_,_,_)操作非常昂贵,需要几秒钟才能完成。

1 个答案:

答案 0 :(得分:0)

RabbitMQ脱离channels概念的支持,并且通常旨在在线程之间共享通道。此外,默认情况下,通道的工作线程池大小为1。频道是会话的模拟。

在您的情况下,您有多个使用者共享队列和通道,并在该通道的事件处理程序中执行长时间的工作。

有两种方法可以解决此问题:

  1. 为每个消费者分配一个渠道,或
  2. 在创建See this documentation时设置通道的工作池大小

我建议每个消费者使用1个频道,因为它引起意外副作用的可能性较低。