【问题标题】:Unbelievable issue with resque - uninitialized constant MyWorkerresque 令人难以置信的问题 - 未初始化的常量 MyWorker
【发布时间】:2014-06-02 18:46:03
【问题描述】:

我在 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真的是真的随机

这里是异常回溯的粘贴箱:http://pastebin.com/jy5UakB8

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rake resque uninitialized-constant


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我通过控制台访问MediaAnalyzer 没有问题:/ app/workers 在加载路径中...
    • 但即使通过resque:setup(成功地)请求文件,resque 仍然“随机”地加载类失败。即使我可以毫无问题地访问 resque:setup 中的类。
    【解决方案2】:

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

    我为这个应用程序准备了 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 显然是测试版)

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 看看下面我自己的答案。这是一个命名空间问题。 ;-)
      猜你喜欢
      • 2016-01-20
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多