Resque:每个队列一个工作者

时间:2012-02-13 19:09:16

标签: ruby ruby-on-rails-3 resque ruby-1.9.2

我目前有一个Rails 3.0项目,Ruby 1.9.2和Resque。

我的应用程序有多个工作类和多个队列,它们是动态创建的(在运行时)。此外,还有多个工作人员可以自由地在任何队列上工作,因为在开始时没有任何现有队列,并且无法预测它们:

$ COUNT=3 QUEUE=* rake resque:workers

根据project的id:

对创建的队列进行排队
@queue = "project_#{project.id}".to_sym

对于给定的队列,他们的工作必须按顺序处理,一次处理一个。我的问题是,通过拥有多个工作人员,可以并行处理多个工作。

有没有办法设置每个队列的最大工作数(为1)?有没有办法在作业处理时锁定队列?

谢谢!

3 个答案:

答案 0 :(得分:2)

我终于找到了一个非常简单的解决方案,使用resque-retry和存储在redis中的锁(我正在为用户做这个,只为项目做):https://stackoverflow.com/a/10933666/745266

答案 1 :(得分:1)

我想到的第一个解决方案是检查当另一个工作人员轮询同一队列时是否有任何工作人员在给定队列中工作。这可以通过重新实现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

可能的问题是竞争条件。想法?

答案 2 :(得分:1)

Resque-pool可以帮助您指定每个队列的工作人员数量。

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