2

我在 Resque 遇到了一个非常奇怪的错误。

  • 我有 5 名工人在运行,有一个队列,等待工作。
  • 我有 1 种类型的 Resque 工作人员:MediaAnalyzer

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

为什么有时?因为有时工作的处理完全没有任何问题。然而,我得到了其他一些时间uninitialized constant 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:setup 任务手动加载类:

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

这不会导致错误,在此之后我可以require使用类中的所有内容,我可以输出内容,因此实际上调用了这个 rake 任务......但是 resque 在稍后加载这个类时一直失败。

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

这是异常回溯的pastebin:http: //pastebin.com/jy5UakB8

尝试使用 resque 2.0,同样的问题。

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

4

3 回答 3

1

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

于 2015-03-05T01:27:13.310 回答
1

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

如果在引用类本身之前明确要求定义类的文件,则不会出现异常。如果您首先引用 Rails,请尝试在加载路径中找到相应的文件。如果它找不到它,它就会提高。

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

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

于 2014-04-18T10:05:36.643 回答
1

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

我为这个应用程序准备了 2 个阶段,测试版和生产。实际的问题是,MediaAnalyzer 不再存在于 beta 应用程序中……我的 beta 工作人员正在执行工作,而不是生产应用程序的工作人员。

我没有足够注意异常日志,它myapp_beta/在回溯中说。

这个问题很容易解决,我只需要将 redis/resque 命名为:

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

并将此环境变量添加到 worker 命令中:

RESQUE_NAMESPACE=resque:myapp_production 

(或者RESQUE_NAMESPACE=resque:myapp_beta显然是测试版)

这就是为什么它是随机的,这取决于哪个工人正在接受这份工作,一个来自测试版或一个来自生产。

于 2014-04-20T00:04:48.187 回答