【问题标题】:Starting multiple DelayedJob workers w/ specific queues via Capistrano tasks通过 Capistrano 任务启动具有/特定队列的多个延迟作业工作者
【发布时间】:2012-03-20 10:03:48
【问题描述】:

我正在研究使用带延迟作业的队列。我找到了this page,它概述了启动工人的各种方法,但是我想保留我目前的 Capistrano 方法:

set :delayed_job_args, "-n 2 -p ecv2.production"
after "deploy:start",  "delayed_job:start"
...

我想知道如何修改 delay_job_args 以处理生成 1 个具有特定队列的工作人员,以及为每个其他工作生成 1 个工作人员。到目前为止,我所拥有的只是像这样覆盖每个任务:

namespace :delayed_job do
  task :restart, :roles => :app do
    run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -p ecv2.production --queue=export restart"
    run "cd #{current_path}; RAILS_ENV=#{rails_env} script/delayed_job -p ecv2.production restart"
  end
end

...但这并不好玩。有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    我在deploy.rb 文件中使用此设置将我的作业分成两个队列,每个队列隔离一名工作人员:

    namespace :delayed_job do
      task :start, roles: :app do
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one start"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two start"
      end
    
      task :stop, roles: :app do
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one stop"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two stop"
      end
    
      task :restart, roles: :app do
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_one --queue=one restart"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i queue_two --queue=two restart"
      end
    end
    

    命令的-i name 部分非常重要。这就是允许多个delayed_job 实例运行的部分。

    如果您想将工作人员添加到特定队列,那么您可以像这样扩展它们(我有两个工作人员专门在队列一上,一个工作人员专门在队列二上):

    namespace :delayed_job do
      task :start, roles: :app do
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 --queue=one start"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 --queue=one start"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two --queue=two start"
      end
    
      task :stop, roles: :app do
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 stop"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 stop"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two stop"
      end
    
      task :restart, roles: :app do
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one1 --queue=one restart"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i one2 --queue=one restart"
        run "cd #{current_path}; #{rails_env} bundle exec script/delayed_job -i two --queue=two restart"
      end
    end
    

    【讨论】:

      【解决方案2】:

      经过一番折腾,我发现的技巧是恢复到“set :delayed_job_args”并使用--queues=(复数)而不是--queue=(单数)。希望这可以帮助遇到同样问题的其他人。

      set :delayed_job_args, "-n 2 -p ecv2.production --queues=cache,export"
      

      更新:我现在使用的...

      after "deploy:stop",    "delayed_job:stop"
      after "deploy:start",   "delayed_job:start"
      after "deploy:restart", "delayed_job:restart"
      
      namespace :delayed_job do
        # See 'man nice' for details, default priority is 10 and 15 is a bit lower
        task :start, :roles => :app do
          run "cd #{current_path}; #{rails_env} nice -n 15 ruby script/delayed_job -n 1 -p yourapp.#{application} start"
        end
      
        task :restart, :roles => :app do
          stop
          start
        end
      end
      

      【讨论】:

      • 这只会启动 2 个处理相同 2 个队列的工作人员,不是吗?不是你想要的。
      • 不是我所希望的,不。但我当时能想到的最好的。
      • 我明白了。我为每个队列使用了一个单独的命令,就像你在问题中写的那样。似乎 DJ 的 capistrano 任务不适合多队列。
      • 如果您的run 行使用bundle execnice -n 15 会在它之前还是之后(在bundle execruby script/delayed_job 之间)?
      猜你喜欢
      • 2011-05-19
      • 2013-06-19
      • 2011-03-24
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2013-07-01
      • 2011-08-26
      • 2011-08-23
      相关资源
      最近更新 更多