我有一个问题我已经研究了一段时间但无法弄清楚......感谢任何帮助,
我们在 Heroku 上运行 redis、resque 和 resque-scheduler。许多计划的作业没有运行。/resque/failed 网页显示错误,表明 rails 从未在工作进程中加载。许多错误没有进入 /resque/failed 页面列表。但是,作业要运行很多次。
我还在 /resque/workers 中看到了比在 Heroku 中运行的更多的工人。我无法解释这一点。我从 rails 控制台杀死了工作人员,重新启动 Heroku 工作人员,一切看起来都不错,但最终更多的工作人员出现在 /resque/workers 页面中。注意:这些工人不会因为 Heroku 重新启动(每 24 小时执行一次)而出现。在我看到第三个工人的出现(我在 Heroku 中运行 2 个)后,我做了一个“heroku ps”,显示 2 个 Heroku 作品的正常运行时间约为。7小时。
我怀疑 resque-scheduler 用来与等待和就绪的工作进程通信的机制在某种程度上被破坏了。并且额外的worker是resque机制仍然“看到”的已失效的rails进程(即,这些失效的worker在Redis中有条目)。
更多细节:-我注意到 /resque/workers 网页中显示了 6 个工作人员,因此我使用 Rails 控制台杀死了所有工作人员。然后我重新启动了 Heroku 中的工人。那什么也没做,所以我在 Heroku 中重新启动了 resque-scheduler 进程。仍然没有变化,但是 /resque/workers 页面显示了正确数量的 resque 工作人员(该数量与 heroku 工作进程的数量相匹配)。- 大约 12 小时后,我注意到 /resque/workers 页面中出现了更多的工人。怎么回事?- 有些工作确实得到了处理,我在每个工人的完成总数中看到了这些(即,所有工人都显示非零的 num_processed 值)。-我确实看到日志显示有时工人会跑。
这里有明显的问题吗?有人可以描述 Redis 中与 resque-scheduler 与 resque 工作人员通信相关的键/条目结构吗?我注意到 resque 不再与 ruby 1.9.2 兼容,但我不认为这是可能的原因,因为问题是间歇性的。我意识到我们使用 resque 的 v. 1 而不是 v. 2。
我通读了这个看起来相似的问题:Resque on Heroku cedar stack Worker count still exists after the worker terminate but that it not my question (因为我没有将命令行上的 ENV 变量传递给 heroku workers/aka resque worker processes)。
虽然它可能与此有关: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-scheduler-2.3.1
Procfile(由 Heroku 使用): web: bin/start-nginx bundle exec unicorn --env $RACK_ENV -c ./config/unicorn.rb worker: bundle exec rake jobs:work 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:工作”
——迈克·帕珀