Иногда Resque «выгружает» среду Rails без видимой причины - PullRequest
2 голосов
/ 06 декабря 2011

У меня есть простой стек с Ruby on Rails и resque . Я ставлю рабочие места в обычном порядке, и у меня есть пул рабочих, выполняющих. Ничего сумасшедшего.

Моя проблема в том, что если я оставлю рабочих на долгое время достаточно, они перестанут видеть модели приложений, и каждый вызов такого метода приведет к undefined_method.

Это очень странно, так как может работать отлично в течение нескольких дней, а затем внезапно начинает работать . Перезапуск рабочего исправляет проблему, но обычно через некоторое время возвращается.

Я понятия не имею, что может происходить, поэтому любые указатели будут с благодарностью.

1 Ответ

2 голосов
/ 19 декабря 2011

Рабочие Resque внедряют новые процессы для выполнения работы. Вполне возможно, что классы для ваших моделей не загружаются в дочерний дочерний процесс. Также возможно, что существует конфликт пространства имен из-за порядка загрузки классов.

Если вы изменяете файлы классов в процессе разработки, не перезапуская своих работников, использующих Resque, я подозреваю, что они неправильно перезагружают ваши классы.

Чтобы убедиться, что ваши классы загружены предварительно, обратитесь к классам в задаче установки resque. Классы, загруженные предварительно, будут скопированы в дочерний процесс. Ниже я помещаю их в массив, чтобы заставить их загружаться. Это также быстрее, так как каждый дочерний процесс уже имеет загруженные классы. Также вам следует восстановить соединение ActiveRecord в блоке after_fork, если вы используете AR.

Lib / задачи / 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
...