1

问题是:

当我对工作人员执行的代码进行更改时,在我推送新代码后,heroku 上正在运行的工作人员仍然与以前的工作人员一起执行。

然后我必须手动停止并重新开始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 时,是否可以使用新代码更新工作人员。怎么可能做到?

谢谢!!

4

1 回答 1

2

Heroku 会在部署时重新启动所有进程作为平台功能——除了通过heroku run.

将工作进程类型添加到您的Procfile

worker: bundle exec rake resque:work QUEUE=*

Push,然后告诉 Heroku 运行你的 worker:

$ heroku ps:scale worker=1

Heroku 现在将确保您worker始终运行一个测功机。当您的应用程序重新启动时(例如,在 push、a heroku restartrollback之后),或者您的工作人员以某种方式死亡,或者它所在的主机出现故障时,它会自动重新启动它。Heroku 甚至每天都会在新主机上优雅地关闭并重新启动您的工作进程,以清除临时文件,限制任何内存泄漏,并重新平衡测功网格周围的负载。

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

于 2012-11-29T15:24:52.693 回答