当我将应用程序推送到heroku时,如何自动化resque worker更新其代码?

时间:2012-11-29 14:35:18

标签: ruby-on-rails heroku resque

问题是:

当我对worker执行的代码进行更改时,heroku上的正在运行的worker仍然在我推送新代码后执行。

然后我必须手动停止并重新开始resque。但我猜错了,因为工人可能正在执行某项工作,必须等到它才能取消注册。

这是我的 resque.rake

require 'resque'
require "resque/tasks"

task "resque:setup" => :environment do
  ENV['QUEUE'] = '*' if ENV['QUEUE'].blank?

  Resque::Worker.all.each {|w| w.unregister_worker}
  Resque.after_fork do |job| 
    ActiveRecord::Base.establish_connection
  end
end

task "resque:clean_workers" => :environment do
  Resque::Worker.all.each {|w| w.unregister_worker}
end

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

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

我想知道当我将我的应用程序推送到heroku时,工作人员可以使用新代码进行更新。怎么可能呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

Heroku将部署的所有流程作为平台功能重新启动 - 除了通过heroku run生成的一次性流程。

将工作人员流程类型添加到Procfile

worker: bundle exec rake resque:work QUEUE=*

推送,然后告诉Heroku运行你的工作人员:

$ heroku ps:scale worker=1

Heroku现在可以确保您有一个worker dyno随时都在运行。它会在您的应用重新启动时自动重启(例如,在推送,heroku restartrollback之后),或者您的工作人员以某种方式死亡,或者它的主机发生故障。 Heroku甚至会优雅地每天关闭并重新启动新主机上的工作进程,只是为了更好地衡量,清除临时文件,限制任何内存泄漏,并重新平衡dyno网格周围的负载。

如果您在生产中全天候运行后台作业,这就是您想要的行为。