【问题标题】:ruby on rails stop resque worker when deploy to the serverruby on rails 在部署到服务器时停止 resque worker
【发布时间】:2013-07-28 11:45:21
【问题描述】:

为什么我们在将代码部署到服务器时需要停止 resque worker?

这是我的部署文件的一部分。我发现代码中可能存在错误:

namespace :resque do
  desc "Start resque workers"
  task :start do
    # Start two workers with separate run commands, so we can store their PIDs
    # Hacky, but works
    run "if [ ! -e #{deploy_to}/shared/pids/resque_production_1.pid ]; then cd #{deploy_to}/current && RAILS_ENV=production QUEUE=* PIDFILE=#{deploy_to}/shared/pids/resque_production_1.pid BACKGROUND=yes VERBOSE=1 bundle exec rake environment resque:work; fi;"
    run "if [ ! -e #{deploy_to}/shared/pids/resque_production_2.pid ]; then cd #{deploy_to}/current && RAILS_ENV=production QUEUE=* PIDFILE=#{deploy_to}/shared/pids/resque_production_2.pid BACKGROUND=yes VERBOSE=1 bundle exec rake environment resque:work; fi;"
  end

  desc "Stop resque workers"
  task :stop do
    run "if [ -e #{deploy_to}/shared/pids/resque_production_2.pid ]; then echo \"Killing Worker #1\"; kill -s QUIT `cat #{deploy_to}/shared/pids/resque_production_2.pid`; rm -f #{deploy_to}/shared/pids/resque_production_2.pid; echo \"Done\"; fi;"
    run "if [ -e #{deploy_to}/shared/pids/resque_production_2.pid ]; then echo \"Killing Worker #2\"; kill -s QUIT `cat #{deploy_to}/shared/pids/resque_production_2.pid`; rm -f #{deploy_to}/shared/pids/resque_production_2.pid; echo \"Done\"; fi;"
  end

似乎有一些错误:

# stop resque worker

/resque_production_2.pid

他们都杀死 /resque_production_2.pid ...这意味着在部署期间没有杀死一名工人...您认为这会导致任何问题...

因为我最近发现我的一项 resque 作业无法排队到生产服务器中的队列中。并且没有在列表中显示失败。可能是由这个引起的吗?但它在登台服务器中工作正常。生产服务器中的其他 resque 作业也可以正常工作。这很奇怪。

【问题讨论】:

    标签: ruby capistrano resque


    【解决方案1】:

    在部署期间重新启动 Resque 工作程序,以确保最新版本的代码(通常是模型和工作程序)在工作程序中运行。未能重新启动工作人员意味着工作人员正在运行上次启动它的代码的修订版;如果您对功能进行了重大更改,那么您运行的代码可能会破坏或引入错误,因为您当前的代码可能与其正在运行的代码版本不兼容。

    顺便说一句,类似以下形式的内容将有助于防止将来出现此类错误(以及让您仅通过增加上限来添加额外的工作人员):

    WORKER_COUNT = 2
    
    task :start do
      # Start n workers with separate run commands, so we can store their PIDs
      1.upto(WORKER_COUNT) do |i|
        run "if [ ! -e #{deploy_to}/shared/pids/resque_production_#{i}.pid ]; then cd #{deploy_to}/current && RAILS_ENV=production QUEUE=* PIDFILE=#{deploy_to}/shared/pids/resque_production_#{i}.pid BACKGROUND=yes VERBOSE=1 bundle exec rake environment resque:work; fi;"
      end
    end
    
    desc "Stop resque workers"
    task :stop do
      1.upto(WORKER_COUNT) do |i|
        run "if [ -e #{deploy_to}/shared/pids/resque_production_#{i}.pid ]; then echo \"Killing Worker #1\"; kill -s QUIT `cat #{deploy_to}/shared/pids/resque_production_#{i}.pid`; rm -f #{deploy_to}/shared/pids/resque_production_#{i}.pid; echo \"Done\"; fi;"
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多