【问题标题】:Rails, Capistrano and DelayedJob: make a deploy with an active taskRails、Capistrano 和 DelayedJob:使用活动任务进行部署
【发布时间】:2014-08-13 08:25:39
【问题描述】:

我正在将一个应用程序运行到生产服务器中,该应用程序需要 DelayedJob 来执行后台任务。这些任务需要很长时间才能执行。

我的 deploy.rb 有这样的东西:

desc "Start workers"
task :start_workers do
  run "cd #{release_path} && RAILS_ENV=production script/delayed_job -n 2 start"
end

desc "Stop workers"
task :stop_workers do
  run "cd #{current_path} && RAILS_ENV=production script/delayed_job stop"
end

before "deploy", "stop_workers"
after "deploy:start", "start_workers"

现在,让我们假设有一个后台作业。我需要更新应用程序。运行部署,会导致延迟的作业停止,任务会中断。

如何在不停止后台作业的情况下进行部署?

【问题讨论】:

    标签: ruby-on-rails capistrano delayed-job


    【解决方案1】:

    delayed_job 将等待当前作业完成处理(除非您真的强制它停止)。

    所以,我认为您有几个选择。您可以等待当前作业完成,然后再继续部署。我很确定这就是您的代码当前将执行的操作。

    或者,您可以让delayed_job 继续在后台处理其当前作业。 IE。告诉delayed_job 停止队列,但不要同时暂停部署。它将继续使用您之前部署的代码运行。我建议这样做的风险更大,因为您的部署过程可能包括数据库架构更改和迁移,这可能会导致当前运行的作业出现问题。

    最后,您可以对长时间运行的作业进行编码,以便它们能够应对中断。 delayed_job 将在失败时重新运行作业。

    听起来你想要第二个选项,但我认为除非作业运行几分钟,否则我会选择等待延迟作业来处理当前作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2018-09-27
      • 2016-03-16
      相关资源
      最近更新 更多