我目前有一个Rails 3.0项目,Ruby 1.9.2和Resque。
我的应用程序有多个工作类和多个队列,它们是动态创建的(在运行时)。此外,还有多个工作人员可以自由地在任何队列上工作,因为在开始时没有任何现有队列,并且无法预测它们:
$ COUNT=3 QUEUE=* rake resque:workers
根据project
的id:
@queue = "project_#{project.id}".to_sym
对于给定的队列,他们的工作必须按顺序处理,一次处理一个。我的问题是,通过拥有多个工作人员,可以并行处理多个工作。
有没有办法设置每个队列的最大工作数(为1)?有没有办法在作业处理时锁定队列?
谢谢!
答案 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可以帮助您指定每个队列的工作人员数量。