簡體   English   中英

與Resoku的背景工作在Heroku

[英]Background jobs with Resque on Heroku

我在Heroku上遇到了一個非常奇怪的問題,我現在一直在旋轉我的車輪想出來。

我的應用程序有一些外部API調用和郵件,我已經設置ActiveJob在后台運行。 在Heroku上我有兩個工作人員設置為,我正在使用Resque / Redis組合來完成以下代碼段的工作。 我在Heroku上使用Redis Cloud插件。

配置/設置

Procfile

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

LIB /任務/ 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

問題

我遇到的問題是當用戶在瀏覽器中使用應用程序時(即,與Web工作者交互)並執行一個動作,觸發其中一個ActiveJob作業,使用web worker而不是resque “內聯”作業工人。 當我運行在我的Heroku應用heroku run rails console台中排隊作業的特定模型方法(通過運行heroku run rails console打開)時,它將作業添加到Redis並使用resque worker按預期運行它。

為什么一種方式正常工作而另一種方式不起作用? 我已經查看了關於該主題的幾乎每個教程/ SO問題,並且已經嘗試了所有內容,因此任何有助於運行作業的幫助,但正確的工作人員將是驚人的!

提前致謝!

我設法通過使用我的配置來解決問題。 似乎行動是通過ActiveJob的“內聯”默認而不是通過Resque進行挖掘的。 為了使工作正常,我只需要將Resque.redis指向等於config/initializers/redis.rb設置的$redis變量,這樣一切都指向同一個Redis實例,然后在config/initializers/active_job.rb移動配置集config/initializers/active_job.rbapplication.rb

作為參考,所有工作的新的和改進的配置是:

配置/設置

Procfile

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

LIB /任務/ resque.rake

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"

非常感謝您提供答案。 它為我節省了很多時間。

你的Procfile中有一個拼寫錯誤。

它應該是resque而不是救援。

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

此外,我不得不再輸入一個命令來使這一切在生產中發揮作用。 希望這有助於某人。

heroku ps:scale resque=1 --app appname

此命令將resque進程縮放為1 dyno(free)。 您也可以通過heroku上的儀表板執行此操作。

您可以在heroku docs https://devcenter.heroku.com/articles/scaling上閱讀更多相關信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM