如何防止额外/任意? resque worker被创建 - 它导致resque-scheduler工作无法在这些已解散的工作人员上运行

时间:2014-12-15 04:36:07

标签: ruby-on-rails ruby-on-rails-3 heroku resque resque-scheduler

我有一个问题,我已经研究了一段时间,无法弄清楚...任何帮助表示赞赏,

我们在Heroku上运行redis,resque和resque-scheduler。许多预定的工作都没有运行。 / resque / failed网页显示错误,指示在工作进程中从未加载过rails。许多错误都没有进入/ resque / failed页面列表。但是,很多次要运行的工作。

我还在/ resque / worker中看到比在Heroku中运行的工人更多的工人。我无法探索这一点。我从rails控制台中杀死了工作人员,重新启动了Heroku工作人员,这一切看起来都不错,但最终更多的工作人员出现在/ resque / workers页面中。注意:这些工作人员不会因Heroku重新启动而出现(每24小时执行一次)。在我看到第三个工人的外表(我在Heroku中运行2个)后,我做了一个" heroku ps"这表明2 Heroku作品的正常运行时间约为。 7个小时。

我怀疑resque-scheduler用于与等待和就绪工作进程通信的机制在某种程度上被破坏了。并且额外的工人是已经失效的铁轨工艺,仍然可以看到"通过resque机制(即Redis为这些已解散的工人提供了条目)。

更多细节: - 我注意到/ resque / workers网页上显示了6个工作人员,因此我使用Rails控制台杀死所有工作人员。然后我重新启动了Heroku中的工作人员。这没有做任何事情,所以我重新启动了Heroku中的resque-scheduler进程。仍然没有chnage,但/ resque / workers页面显示正确数量的resque工作者(该数字与heroku工作进程的数量相匹配)。 - 大约12个小时后,我注意到/ resque / workers页面中出现了更多的工人。 WTF? - 某些工作确实得到了处理,我在每个工人的已完成总计中看到了这些工作(即,所有工人都显示非零num_processed值)。 - 我确实看到日志显示工人有时会跑。

这里有明显的问题吗? 有人可以描述Redis中的密钥/条目结构是否与resque-scheduler与resque工作者进行通信有关? 我注意到resque不再与ruby 1.9.2兼容,但我不认为这可能是因为问题是间歇性的。 而且我意识到我们使用v.1的resque而不是v.2。

我仔细阅读了这个类似的问题:Resque on Heroku cedar stack Worker count still exists after the worker terminate但这不是我的问题(因为我没有在命令行上将ENV变量传递给heroku worker / aka resque worker进程)。

虽然它可能与此有关:https://github.com/resque/resque/issues/319#issuecomment-1789239我没有将任何ENV变量传递给我的工作人员的rake任务命令行。

错误和记录信息:

对于resque-scheduler调度/排队的每个作业,我都会看到一个日志条目,显示它正在执行并在正确的时间执行,例如:

    2014-12-08T22:50:00.120565+00:00 app[scheduler.1]: [INFO] 2014-12-08 22:50:00 +0000: queueing CitrixWorker (CitrixWorker)
    2014-12-08T22:50:00.127388+00:00 app[scheduler.1]: [INFO] 2014-12-08 22:50:00 +0000: queueing InstagramFeed (InstagramFeed)
    2014-12-08T22:50:00.124540+00:00 app[scheduler.1]: [INFO] 2014-12-08 22:50:00 +0000: queueing PageSync (PageSync)

很多时候我从未见过工人跑步。有时候我(再次,从日志中):

    2014-12-08T22:50:00.367083+00:00 app[worker.3]: DEBUG CitrixWorker.update_webinars: starting at 2014-12-08 22:50:00 +0000

/ resque / failed中的示例错误:         例外             NameError         错误             未初始化的常量WorkerProcess =>指示Rails在resque工作进程中从未加载(或不再加载)。

环境和版本:

Ruby 1.9.2
Rails 3.1.11
the workers and resque-scheduler all run as Heroku Dynos.

宝石:     Redis的-3.0.6     resque-1.25.1     resque调度-2.3.1

Procfile(由Heroku使用):     web:bin / start-nginx bundle exec unicorn --env $ RACK_ENV -c ./config/unicorn.rb     工人:捆绑执行耙工作:工作     scheduler:bundle exec rake resque:scheduler

工人的佣金任务:

resque.rake:

    require 'resque/tasks'
    require 'resque/server'
    require 'resque_scheduler/tasks'
    desc 'Called by the resque:work rake task to initialize each worker process (I think)'
    task "resque:setup" => :environment do
      ENV['QUEUE'] = '*' # watch one or all queues (priority of these queues is in alphabetical order when * is specified)
      ENV['INTERVAL'] = '1.0' # lower from default 5 second wait time (polling frequency) 5 gives same erroneous results as 1 second
      puts "INFO: waiting on #{ENV['QUEUE'] == '*' ? 'ALL' : ENV['QUEUE']} Resque queues".info
    end

    desc "Alias for resque:work (To run workers on Heroku using standard worker syntax, which is 'rake jobs:work')"

任务"工作:工作" => " resque:工作"

- Mike Papper

0 个答案:

没有答案