2

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

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

4

1 回答 1

3

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

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

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

  1. 为每个消费者分配一个频道,或者
  2. 在创建时设置通道的工作池大小请参阅此文档

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

于 2018-10-23T11:26:08.983 回答