RabbitMQ Bunny Parallel Потребители - PullRequest
       27

RabbitMQ Bunny Parallel Потребители

0 голосов
/ 23 октября 2018

Я создал приложение, которое состоит из одного издателя, нескольких очередей и нескольких потребителей для каждой очереди.Потребители в очереди (включая очередь) совместно используют канал.Другие очереди используют другой канал.Я наблюдаю, что для разных очередей задачи выполняются параллельно, но для конкретной очереди этого не происходит.Если я публикую несколько сообщений одновременно в определенной очереди, будет работать только один потребитель, в то время как остальные будут ждать окончания работы.Что я должен сделать, чтобы потребители работали параллельно?

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 голосов
/ 23 октября 2018

RabbitMQ работает на основе концепции channels, и каналы обычно предназначены для , а не для совместного использования между потоками.Кроме того, у каналов по умолчанию размер пула рабочих потоков равен единице.Канал является аналогом сеанса.

В вашем случае у вас есть несколько потребителей, совместно использующих очередь и канал, и выполняющих длительную работу в обработчике событий для канала.

Есть два способа обойти это:

  1. Выделить канал для каждого потребителя или
  2. Установить размер рабочего пула канала при создании См. Эту документацию

Я бы рекомендовал по 1 каналу для каждого потребителя, поскольку у него меньше шансов вызвать непреднамеренные побочные эффекты.

...