2016-04-14 4 views
2

У меня есть действительно странная проблема на Heroku, что я крутил колеса, чтобы понять какое-то время.Справочная работа с Resque on Heroku

У моего приложения есть несколько внешних API-вызовов и почтовых программ, которые я установил для ActiveJob в фоновом режиме. На Heroku у меня есть два рабочих, и я использую компиляцию Resque/Redis для работы в соответствии с нижеприведенными фрагментами. Я использую дополнение Redis Cloud на Heroku.

Config/установка

PROCFILE

web: bundle exec puma -C config/puma.rb 
resque: env TERM_CHILD=1 QUEUE=* bundle exec rake rescue:work 

Библиотека/Задачи/resque.rake

require "resque/tasks" 
require "resque/scheduler/tasks" 

task "resque:setup": :environment do 
    Resque.before_fork = proc { ActiveRecord::Base.connection.disconnect! } 
    Resque.after_fork = proc { ActiveRecord::Base.establish_connection } 
end 

конфигурации/Инициализаторы/active_job.rb

Rails.application.config.active_job.queue_adapter = :resque 

конфигурации/Инициализаторы/redis.rb

if ENV["REDISCLOUD_URL"] 
    $redis = Redis.new(url: ENV["REDISCLOUD_URL"]) 
end 

конфигурации/Инициализаторы/resque.rb

if Rails.env.production? 
    uri = URI.parse ENV["REDISCLOUD_URL"] 
    Resque.redis = Redis.new(host: uri.host, port: uri.port, 
          password: uri.password) 
else 
    Resque.redis = "localhost:6379" 
end 

Проблема

Проблема, которую я имею, когда пользователь использует приложение в браузере (т. е. взаимодействует с веб-работником) и за формирует действие, которое запускает одно из заданий ActiveJob, задание выполняется «inline» с использованием рабочего web, а не работника resque. Когда я запускаю определенный метод модели, который ставит в очередь задание в моей консоли приложений Heroku (открывается запуском heroku run rails console), он добавляет задание в Redis и запускает его с использованием рабочего стола resque, как и ожидалось.

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

Заранее благодарен!

ответ

2

Мне удалось решить проблему, немного поиграв с моей конфигурацией. Похоже, что действия были туннелированы с использованием ActiveInline «Inline» по умолчанию, а не через Resque. Чтобы получить работу, мне просто нужно было направить Resque.redis равным $redis переменной, заданной в config/initializers/redis.rb, поэтому все указывало на тот же экземпляр Redis, а затем переместили конфигурационный набор в config/initializers/active_job.rb в application.rb.

Для справки, новый улучшенный & конфигурации, что все работы является:

Config/Setup

PROCFILE

web: bundle exec puma -C config/puma.rb 
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work 

Библиотека/задач/Resque.грабли

require "resque/tasks" 

task "resque:setup" => :environment 

конфигурации/application.rb

module App 
    class Application < Rails::Application 
    ... 

    # Set Resque as ActiveJob queue adapter. 
    config.active_job.queue_adapter = :resque 
    end 
end 

конфигурации/инициализаторы/redis.rb

if ENV["REDISCLOUD_URL"] 
    $redis = Redis.new(url: ENV["REDISCLOUD_URL"]) 
end 

конфигурации/инициализаторы/resque.rb

Resque.redis = Rails.env.production? ? $redis : "localhost:6379" 
2

благодарит за предоставление ответа. Это сэкономило мне много времени.

У вас есть одна опечатка внутри вашего файла Procfile.

Он должен быть рескриптом вместо спасения.

resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 QUEUE=* bundle exec rake resque:work 

Кроме того, мне пришлось ввести еще одну команду, чтобы заставить все это работать на производстве. Надеюсь, это помогает кому-то.

Эта команда масштабирует процесс resque до 1 dyno (бесплатно). Вы также можете сделать это с панели инструментов на героку.

Подробнее об этом можно узнать на документах heroku. https://devcenter.heroku.com/articles/scaling

Смежные вопросы