Отладка Resque :: Server - PullRequest
       20

Отладка Resque :: Server

0 голосов
/ 09 октября 2019

У нас есть два приложения Rails, использующих Resque и Redis. Resque и Redis настроены одинаково в обоих приложениях, которые используют Rails 4.2 и Resque 1.27.4.

Однако доступность сервера Resque на пути /resque лучше всего описать как «неравномерную» для всехдва приложения (я сокращу их настоящие имена до «планирования» и «штатного расписания» для упрощения).

  • Оба сайта работают нормально на производстве (на Heroku). Это особенно интересно, потому что текущее производственное развертывание «планирования» имеет более старые версии Rails и Resque, чем «штатное расписание» - мой текущий проект обновляет его.
  • В стадии «штатное расписание» работает нормально;«планирование» возвращает ошибку 404. (Airbrake не регистрирует ошибку.) Когда задания отправляются в Resque, они, похоже, запускаются;мы просто не можем видеть сервер, чтобы увидеть очередь.
  • В разработке (моя локальная среда), используя rails s, оба приложения вызывают ошибку маршрутизации: No route matches [GET] "/resque", хотя список маршрутов, которыеНа странице ошибок указано /resque с высшим приоритетом:

resque_server_path /resque Resque::Server

С чего мне начать выяснять, что происходит правильно в одном месте и что неправильно в другом?

Вот соответствующая строка routes.rb (все они одинаковы в обоих приложениях):

mount Resque::Server, :at => '/resque', :constraints => RouteConstraint::Admin

lib/tasks/resque.rake:

require 'resque/tasks'

task "resque:setup" => :environment do
  ENV['QUEUE'] = '*'
  Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end

desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"

config/initializers/redis.rb:

# Cloned from staffing

uri = URI.parse(ENV["REDISTOGO_URL"] || "redis://localhost:6379/")
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)

# Tell Resque which redis to use and ensure database connections don't go stale.
Resque.redis = REDIS
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }

# load job classes.
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }

Resque::Plugins::Status::Hash.expire_in = (24 * 60 * 60) # 24hrs in seconds

# https://github.com/resque/resque/wiki/Failure-Backends
require 'resque/failure/multiple'
require 'resque/failure/airbrake'
require 'resque/failure/redis'
Resque::Failure::Multiple.classes = [Resque::Failure::Redis, Resque::Failure::Airbrake]
Resque::Failure.backend = Resque::Failure::Multiple

config.ru включает эту строку среди настроек, не связанных с Resque:

require 'resque/server'

Куда мне смотреть дальше?

ETA: я пытался перейти на resque-web , установив этот драгоценный камень, затем изменив config/routes.rb следующим образом:

require "resque_web"

Rails.application.routes.draw do
  mount ResqueWeb::Engine, :at => "/resque", :constraints => RouteConstraint::SuperAdmin
end

(Очевидно, что в этом файле есть нечто большее, но за исключением end, что буквальноначало файла.) Та же проблема остается: при посещении /resque возникает ошибка No route matches [GET] "/resque", хотя маршрут явно существует. Вот результат вывода rake routes:

Routes for ResqueWeb::Engine:
            overview GET    /overview(.:format)             resque_web/overview#show
       working_index GET    /working(.:format)              resque_web/working#index
         clear_queue PUT    /queues/:id/clear(.:format)     resque_web/queues#clear {:id=>/[^\/]+/}
              queues GET    /queues(.:format)               resque_web/queues#index
               queue GET    /queues/:id(.:format)           resque_web/queues#show {:id=>/[^\/]+/}
                     DELETE /queues/:id(.:format)           resque_web/queues#destroy {:id=>/[^\/]+/}
             workers GET    /workers(.:format)              resque_web/workers#index
              worker GET    /workers/:id(.:format)          resque_web/workers#show {:id=>/[^\/]+/}
       retry_failure PUT    /failures/:id/retry(.:format)   resque_web/failures#retry
  retry_all_failures PUT    /failures/retry_all(.:format)   resque_web/failures#retry_all
destroy_all_failures DELETE /failures/destroy_all(.:format) resque_web/failures#destroy_all
            failures GET    /failures(.:format)             resque_web/failures#index
             failure GET    /failures/:id(.:format)         resque_web/failures#show
                     DELETE /failures/:id(.:format)         resque_web/failures#destroy
               stats GET    /stats(.:format)                resque_web/stats#index
        stats_resque GET    /stats/resque(.:format)         resque_web/stats#resque
         stats_redis GET    /stats/redis(.:format)          resque_web/stats#redis
          stats_keys GET    /stats/keys(.:format)           resque_web/stats#keys
      keys_statistic GET    /stats/keys/:id(.:format)       resque_web/stats#keys {:id=>/[^\/]+/}
                root GET    /                               resque_web/overview#show

Интересно, есть ли что-то о том, как смонтирован двигатель? Или, альтернативно, если что-то скрывает маршрут?

1 Ответ

1 голос
/ 18 октября 2019

Вам следует изучить ограничение маршрутизации, определенное в файле rout.rb. Когда ограничения не выполняются, они возвращают ошибку 404 Not Found в соответствии с ошибкой, которую вы видите. Что происходит, когда вы снимаете ограничение?

...