Resque: один рабочий на очередь

В настоящее время у меня есть проект Rails 3.0 с Ruby 1.9.2 и Resque.

В моем приложении есть несколько рабочих классов и несколько очередей, которые создаются динамически (во время выполнения). Кроме того, запущено несколько рабочих процессов, которые могут работать с любыми очередями, потому что во время запуска нет существующих очередей, и их нельзя предсказать:

$ COUNT=3 QUEUE=* rake resque:workers

Очереди, созданные на основе идентификатора project:

@queue = "project_#{project.id}".to_sym

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

Есть ли способ установить максимальное количество рабочих на очередь (до 1)? Есть ли способ заблокировать очередь во время обработки задания?

Спасибо!


person Henrique Zambon    schedule 13.02.2012    source источник


Ответы (3)


Наконец я пришел к довольно простому решению с использованием повторных попыток восстановления и блокировок, хранящихся в redis (я делаю это для пользователей, просто делаю это для проектов): https://stackoverflow.com/a/10933666/745266

person lacco    schedule 07.06.2012
comment
Хорошо смотрится @lacco, спасибо! Ваша проблема была действительно похожа на мою, поэтому я обязательно рассмотрю ваше решение в ближайшее время. - person Henrique Zambon; 08.06.2012

Первое решение, о котором я подумал, - это проверить, работает ли какой-либо рабочий в данной очереди, когда другой рабочий опрашивает ту же самую очередь. Это можно сделать, переопределив Resque::Job.reserve(queue):

module Resque
  class Job

    def self.reserve(queue)

      Resque::Worker.working.each do |worker|
        # if already working in the same queue
        if worker.job['queue'] == queue
          return
        end
      end

      return unless payload = Resque.pop(queue)
      new(queue, payload)
    end

  end
end

Возможная проблема - состояние гонки. Мысли?

person Henrique Zambon    schedule 14.02.2012
comment
Вы наконец пришли к решению, работает ли код в продакшене? - person lacco; 04.04.2012
comment
Решение оказалось намного сложнее, и я решил пойти с одним рабочим только для того, чтобы гарантировать свое состояние. Когда производительность станет проблемой, я буду об этом беспокоиться! :П - person Henrique Zambon; 14.05.2012

Resque-pool может помочь вам указать количество рабочих в очереди.

https://github.com/nevans/resque-pool

person Nick    schedule 29.05.2012
comment
Спасибо, Ник, но у меня это не работает, так как мои очереди создаются во время выполнения. - person Henrique Zambon; 08.06.2012