Resque: один работник на очередь - PullRequest
7 голосов
/ 13 февраля 2012

У меня сейчас есть проект Rails 3.0 с Ruby 1.9.2 и Resque.

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

$ COUNT=3 QUEUE=* rake resque:workers

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

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

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

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 июня 2012

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

1 голос
/ 29 мая 2012

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

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

1 голос
/ 14 февраля 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

Возможной проблемой может быть состояние гонки.Мысли? * * 1005

...