【问题标题】:Is there a way to make Resque distribute given jobs equally?有没有办法让 Resque 平均分配给定的工作?
【发布时间】:2013-10-15 05:28:33
【问题描述】:

我有 5 个这样的 Resque 工作人员设置:

QUEUE=* rake environment resque:work
QUEUE=* rake environment resque:work
QUEUE=* rake environment resque:work

当我像这样从事繁重的工作时:

100.times do 
Resque.enqueue(DoTheJob)
end

第一个工人得到大约 80 份工作,其他工人分担剩下的……

就我而言,我可能有 40 个并发且非常繁重的工作 - 视频转码 -。它们将被连续触发,我希望将工作平等地或至少公平地分配给我现有的员工(最多可有 30 个)。

有什么选择吗?

我怎样才能做到这一点?

谢谢

【问题讨论】:

  • 如果他们共享相同的所有 100 个作业属于一个队列,那么我猜不是

标签: ruby-on-rails redis background-process resque


【解决方案1】:

好吧,当我用一个最简单的 Resque worker 类结构尝试上面的代码时:

class MyWorker 
@queue=:test

def self.perform(data)

puts "Testing...."

end

end

100.times do 
Resque.enqueue(MyWorker)
end

所有作业都排在同一个工作人员的队列中。

但是。

当我给工人几秒钟 sleep 时,我发现工作被相当公平地分配了。

class MyWorker @queue=:test

def self.perform(data)

puts "Testing...."
sleep 3
end

end

我不知道 Resque 为此目的的算法是什么,但看起来没有问题。

【讨论】:

  • 我认为这与轮询间隔 INTERVAL 变量有关。默认值为 5 秒。如果工人在 5 秒前完成,大概有资格接受新工作。 3 秒的睡眠时间(应用程序初始化时间)足以让第一个工作人员在 5 秒时没有资格从事第二份工作。通过指定INTERVAL=0.1,您可能会在没有sleep 的情况下获得此行为。见:github.com/resque/resque#polling-frequency
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多