我想知道在新代码推送后优雅地重新启动 delay_job 消费者的最佳方法是什么?我正在使用 capistrano 推送代码,并且我知道有要重新启动的命令,但是如果当前有作业正在运行,则该命令要么挂起(并且我的部署需要永远),要么它强制退出当前正在运行的作业并且我丢失了数据。
理想情况下,我希望我的部署像这样发生:
- 现有的延迟作业使用者正在使用版本 1 代码运行
- 我运行
cap deploy
并将版本 2 代码推送到新服务器 - 在部署期间,我们触摸一个文件来告诉delayed_job 在处理完当前作业后重新启动。这可以通过多种不同的方式完成,但我认为这类似于如何优雅地重新启动乘客
- 现有的delayed_job 消费者继续使用版本1 代码完成当前作业
- 当前作业完成,delayed_job 消费者看到它需要重新启动自己才能继续处理作业
- delay_job 消费者自动重启,现在运行版本 2 代码
- delay_job 消费者继续处理作业,现在在版本 2 代码上运行
我试图通过检查代码的当前版本在作业运行之前插入一些代码以重新启动,但每次我这样做时,它都会死掉并且实际上并没有重新启动任何东西。下面的示例代码:
def before(job)
# check to make sure that the version of code here is the right version of code
live_git_hash = LIVE_REVISION
local_git_hash = LOCAL_REVISION
if live_git_hash != local_git_hash
# get environment to reload in
environment = Rails.env # production, development, staging
# restart the delayed job system
%x("export RAILS_ENV=#{environment} && ./script/delayed_job restart")
end
end
它检测到它很好,但它在 shell 调用中死掉了。有任何想法吗?
谢谢!