RabbitMQ Bunny 并行消费者

RabbitMQ Bunny Parallel Consumers

我构建了一个应用程序,其中包含一个发布者、多个队列和每个队列的多个消费者。一个队列(包括队列)上的消费者共享通道。其他队列使用不同的通道。我观察到对于不同的队列,任务正在并行工作,但对于特定的队列,这并没有发生。如果我一次向特定队列发布多条消息,则只有一个消费者工作,而其他消费者则等待工作结束。我应该怎么做才能让消费者并行工作?

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

RabbitMQ 在 channels 概念的背后工作,通道通常旨在 在线程之间共享。此外,默认情况下,通道的工作线程池大小为 1。频道类似于会话。

在你的例子中,你有多个消费者共享一个队列和通道,并在通道的事件处理程序中执行一个长时间的作业。

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

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

我提倡每个消费者 1 个渠道,因为它引起意外副作用的可能性较低。