[英]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.rb
到application.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.