【问题标题】:Sometimes Resque "unloads" the Rails environment for no apparent reason有时 Resque 会无缘无故“卸载” Rails 环境
【发布时间】:2011-12-20 01:55:29
【问题描述】:

我有一个使用 Ruby on Rails 和 resque 的简单堆栈。我以正常方式排队工作,并且有一群工人在执行。没什么疯狂的。

我的问题是,如果我让工作人员运行足够长的时间,他们将停止查看应用程序的模型,并且每次调用此类方法都会导致 undefined_method。

这很奇怪,因为它可以正常工作好几天,然后突然开始失败。重新启动 Worker 可以解决问题,但它通常会在一段时间后恢复。

我不知道会发生什么,所以任何指针将不胜感激。

【问题讨论】:

  • 你在那段时间做一些发布吗? capistrano 是否正在删除 resque 正在处理的文件或类似的文件?
  • @phoet 它正在开发中。我还没有生产环境。我可能正在更改文件,但一旦工作人员加载它们就应该很重要 - 我认为
  • 能否请您发布失败期间发生的堆栈跟踪? 听起来在我看来,您的工作人员已经失去了与数据库的连接,而不是应用程序代码离开了。但我不是 Rails/Activerecord 用户,所以我不确定。

标签: ruby-on-rails ruby require resque worker


【解决方案1】:

Resque 工作人员派生出新的流程来完成工作。您的模型的类可能未在分叉的子进程中加载​​。由于加载类的顺序,也可能存在命名空间冲突。

如果您在开发中更改类文件而不重新启动 resque worker,我怀疑它没有正确重新加载您的类。

要确保您的类在分叉前加载,请在 resque 设置任务中引用这些类。 pre-fork 加载的类将被复制到子进程。下面,我将它们放在一个数组中以强制它们加载。这也更快,因为每个子进程都已经加载了类。如果您使用 AR,您还应该在 after_fork 块中重新建立 ActiveRecord 连接。

lib/tasks/resque.rake:

namespace :resque do
  task :setup => :environment do
    [User, Monkey, Banana] # force these classes to load

    Resque.after_fork { ActiveRecord::Base.establish_connection }
  end
end

【讨论】:

  • 为什么要在 after_fork 中重新建立 AR 连接?
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多