ruby-on-rails – 如何正常重启delayed_job使用者?
我想知道在新代码推送后优雅地重启delayed_job消费者的最佳方法是什么?我正在使用capistrano推送代码,我知道有重启的命令,但是如果当前正在运行的作业,命令要么挂起(我的部署需要永久),要么强行退出当前正在运行的作业,我会丢失数据.
理想情况下,我希望我的部署发生如下: >现有的delayed_job使用者使用版本1代码运行 我试图通过检查代码的当前版本来插入一些代码以在作业运行之前重新启动,但每次我这样做时,它就会死掉并且实际上不会重新启动任何东西.示例代码如下: 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调用中死亡.有任何想法吗? 谢谢! 解决方法
提出了一个有效的解决方案.
我有一个基类,所有延迟的作业都从名为BaseJob继承: class BaseJob attr_accessor :live_hash def before(job) # check to make sure that the version of code here is the right version of code resp = HTTParty.get("#{Rails.application.config.root_url}/revision") self.live_hash = resp.body.strip end def should_perform() return self.live_hash == GIT_REVISION end def perform() if self.should_perform == true self.safe_perform() end end def safe_perform() # override this method in subclasses end def success(job) if self.should_perform == false # log stats here about a failure # enqueue a new job of the same kind new_job = DelayedJob.new new_job.priority = job.priority new_job.handler = job.handler new_job.queue = job.queue new_job.run_at = job.run_at new_job.save job.delete # restart the delayed job system %x("export RAILS_ENV=#{Rails.env} && ./script/delayed_job stop") else # log stats here about a success end end end 所有基类都继承自BaseJob并覆盖safe_perform以实际完成其工作.关于上述代码的一些假设: > Rails.application.config.root_url指向应用程序的根目录(即:www.myapp.com) 我最终做的是将git rev-parse HEAD的输出放在一个文件中并用代码推送它.它会在启动时加载,因此可以在web版本和delayed_job使用者中使用. 当我们通过Capistrano部署代码时,我们不再停止,启动或重新启动delayed_job使用者.我们在每分钟运行的消费者节点上安装一个cronjob,并确定delayed_job进程是否正在运行.如果不是,那么将产生一个新的. 由于所有这些,满足以下所有条件: >推送代码不会在delayed_job上等待重启/强制终止.当推送新代码时,正在运行的现有作业将保持不变.>如果消费者正在运行旧代码,我们可以检测作业何时开始.工作得到重新排列,消费者自杀.>当delayed_job死亡时,通过带有新代码的cronjob生成一个新的代码(根据启动delayed_job的性质,它有新代码).>如果您对杀死delayed_job消费者感到妄想,请安装一个与cron作业相同的nagios检查,但是当delayed_job进程没有运行5分钟时会提醒您. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 转载: 《Flash:DisplayObject的矩阵旋转(移动/修改注册点
- ruby-on-rails – 带有Rails的Twitter机器人
- C++类头文件不暴露私有变量的一种写法
- Install Oracle Database 12cR2 On Oracle Enterprise Linu
- swift – 如何使用AudioKit加载第三方音频单元
- swift 网络请求&json解析
- c – 构建大型(ish)无序集合,并在开头提供所有可用数据
- dojo学习笔记(三)
- PostgreSQL独特的价值acreoss多列
- postgresql – 可编程的方式来管理Heroku Postgres上的独立