【问题标题】:How can I automate resque workers to update their code when I push my app to heroku?当我将我的应用程序推送到 Heroku 时,如何自动化 resque 工作人员来更新他们的代码?
【发布时间】:2012-11-29 23:24:52
【问题描述】:

问题是:

当我对工作人员执行的代码进行更改时,在我推送新代码后,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 时,是否可以使用新代码更新工作人员。怎么可能?

谢谢!!

【问题讨论】:

  • 你确定之前的worker还在运行吗?推送后您的 Heroku 日志是什么样的? heroku ps呢?
  • 部署后显示“0 of 1 Workers”,但它很脏。它应该让heroku自己做吗?我正在使用heroku run:detached bundle exec rake resque:work QUEUE=* 运行resque。谢谢

标签: ruby-on-rails heroku resque


【解决方案1】:

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

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

worker: bundle exec rake resque:work QUEUE=*

推送,然后告诉 Heroku 运行您的工作器:

$ heroku ps:scale worker=1

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

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

【讨论】:

  • 谢谢!我将在 procfile 中放入一个工人:worker: bundle exec rake worker:all。那应该调用 resque rake 任务和我的其他 sqs poll 任务
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2022-10-15
  • 1970-01-01
  • 2020-09-05
  • 2023-01-30
相关资源
最近更新 更多