2

我有一个问题我已经研究了一段时间但无法弄清楚......感谢任何帮助,

我们在 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:工作”

——迈克·帕珀

4

0 回答 0