1

我遇到了一个极其奇怪的Resque问题。令人难以置信的resque问题 - 未初始化的常量MyWorker

  • 我得到5名工人跑,有一个队列,等待工作。
  • 我得到了1型Resque工人:MediaAnalyzer

这里是世界上最奇怪的事:有时(是的,有时),resque找不到类MediaAnalyzer。

为什么有时?因为有时候工作没有任何问题。还有一些时候我得到了​​。更奇怪的是,如果我通过resque-web重试这个工作,几次之后,工作人员终于找到并执行了......

所有的工作人员都以相同的方式启动(除了PID和日志路径):

su -c "cd /myapp/current; bundle exec rake environment resque:work RAILS_ENV=production QUEUES=* BACKGROUND=yes PIDFILE=/myapp/current/tmp/pids/resque_worker.1.pid 2>&1 >> /myapp/shared/log/resque_worker.1.log" - rails 

注:在前台模式我继续得到同样的错误控制台上手动启动时也是如此。

我甚至尝试通过resque手动加载类:设置任务:

task "resque:setup" => :environment do 
    require Rails.root.join("app/workers/media_analyzer").to_s 
end 

这个原因没有错误,我可以在此require后使用一切都在上课,我可以输出的东西,所以这个rake任务实际上被称为...但resque保持在稍后加载此类的失败。

最大的难点就是这个bug真的是真的随机

这里是例外回溯的引擎收录:http://pastebin.com/jy5UakB8

试图与resque 2.0,同样的问题。

如果你知道发生了什么,你是一个天才!

回答

1

好吧,我解决了这个问题。这是一个非常愚蠢的问题。

我为这个应用程序,测试版和制作2阶段。实际的问题是,MediaAnalyzer现在还没有出现在测试版应用程序中......而我的测试版工作人员正在执行这些工作,而不是生产应用程序中的工作人员。

我没有对异常日志给予足够的重视,它在回溯中说的是myapp_beta/

问题很简单解决,我不得不命名空间Redis的/ resque:

Resque.redis.namespace = "resque:myapp_#{Rails.env}" 

而这个环境变量添加到工作命令:

RESQUE_NAMESPACE=resque:myapp_production 

(或RESQUE_NAMESPACE=resque:myapp_beta为测试显然)

这就是为什么它是随机的,这取决于哪个工作人员抓住工作,一个从测试版或一个从生产。

0

您体验到的随机问题很容易由Rails/Ruby自动加载引起。加载的订单文件有时是不可猜测的。结合使用错误的文件名称或将其放入错误的目录可能会导致此问题。

如果您在引用类本身之前明确要求您的类定义的文件,则不会得到异常。如果您引用第一个Rails,请尝试在加载路径中找到相应的文件。如果它找不到它,它就会升起。

请仔细检查您的文件名并查看$LOAD_PATH变量。应包括app/workers

一个简单的测试就是运行rails console并简单地访问MediaAnalyzer

+0

我没问题通过控制台访问'''MediaAnalyzer''':/ '''app/workers'''在加载路径中... – PofMagicfingers

+0

但是即使当需要(成功) ''resque:setup''',resque保持“随机”失败加载类。即使我可以在没有任何问题的情况下访问resque:setup中的类。 – PofMagicfingers

1

如果您使用ActiveJob并注意到这一点,我发现解决该问题的方法是重新启动Redis服务器。我不确定为什么这项工作还不错,但是在我做到这一点之后,所有的工作都开始了,并且杀掉了所有的工人。

+0

请看下面我自己的答案。这是一个命名空间问题。 ;-) – PofMagicfingers