Невероятная проблема с resque - неинициализированная константа MyWorker

Я столкнулся с чрезвычайно странной ошибкой с Resque.

  • У меня работает 5 рабочих с одной очередью, ожидающих заданий.
  • У меня есть 1 тип Resque worker: 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 продолжает давать сбой при загрузке этого класса позже.

Самая большая трудность заключается в том, что эта ошибка действительно случайна!

Вот вставка обратной трассировки исключения: http://pastebin.com/jy5UakB8

Пробовал с resque 2.0, та же проблема.

Если ты знаешь, что происходит, ты гений!


person PofMagicfingers    schedule 18.04.2014    source источник


Ответы (3)


Случайная проблема, с которой вы столкнулись, может быть легко вызвана автозагрузкой Rails/Ruby. Загружаемые файлы заказов иногда невозможно угадать. В сочетании с использованием неправильного имени файла для вашего класса или помещением его в неправильный каталог может привести к этой проблеме.

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

Пожалуйста, дважды проверьте имена ваших файлов и взгляните на переменную $LOAD_PATH. app/workers должен быть включен.

Простой тест для начала — запустить rails console и просто получить доступ к MediaAnalyzer.

person iltempo    schedule 18.04.2014
comment
У меня нет проблем с доступом к MediaAnalyzer через консоль:/ app/workers находится в пути загрузки... - person PofMagicfingers; 18.04.2014
comment
Но даже когда требуется (успешно) файл через resque:setup, resque продолжает случайным образом терпеть неудачу при загрузке класса. Даже если я могу без проблем получить доступ к классу в resque:setup. - person PofMagicfingers; 18.04.2014

Ладно, ребята, я исправил проблему. И это был действительно глупый вопрос.

У меня есть 2 стадии для этого приложения, бета и производство. На самом деле проблема заключалась в том, что MediaAnalyzer больше не присутствует в бета-приложении... И мои работники из бета-версии выполняли задания вместо рабочих из производственного приложения.

Я не обратил должного внимания на журнал исключений, он говорил, что myapp_beta/ в трассировке.

Проблема проста для решения, мне просто нужно было указать пространство имен redis/resque с помощью:

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

И добавьте эту переменную среды в рабочую команду:

RESQUE_NAMESPACE=resque:myapp_production 

(или RESQUE_NAMESPACE=resque:myapp_beta для бета-версии, очевидно)

Вот почему это было случайным, это зависело от того, какой работник ловил работу, один из бета-версии или один из производства.

person PofMagicfingers    schedule 20.04.2014

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

person baweaver    schedule 05.03.2015
comment
Посмотрите на мой собственный ответ ниже. Это была проблема с пространством имен. ;-) - person PofMagicfingers; 04.04.2015