Resque:每个队列一个工作进程

9
我目前有一个Rails 3.0项目,使用Ruby 1.9.2和Resque。
我的应用程序有多个工作类和多个队列,这些队列是在运行时动态创建的。此外,有多个工作者开始自由地在任何队列上工作,因为在启动时并不存在任何现有队列,并且它们无法预测:
$ COUNT=3 QUEUE=* rake resque:workers

队列是基于项目的ID创建的:

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

对于给定的队列,它们的任务必须按顺序一个接一个地处理。我的问题是,通过有多个工作者,会并行处理多个作业。

有没有一种方法可以设置每个队列的最大工作者数量(为1)?有没有一种方法可以在处理作业时锁定队列?

谢谢!

3个回答

2

谢谢Nick,但那对我不起作用,因为我的队列是在运行时创建的。 - Henrique Zambon

2

看起来不错 @lacco,谢谢!你的问题和我的非常相似,所以我肯定很快会看一下你的解决方案。 - Henrique Zambon

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

可能存在的问题是竞态条件。你有什么想法吗?

你最终找到了解决方案吗?代码在生产环境中工作了吗? - lacco
解决方案比我想象的要复杂得多,因此我决定只使用一个工作线程来保证我的条件。每当性能成为问题时,我会担心它!:P - Henrique Zambon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接