我正在研究使用具有delayed_job的队列.我找到了
this page,其中列出了各种启动工作的方式,但是我想保留我当前的Capistrano方法:
set :delayed_job_args,"-n 2 -p ecv2.production" after "deploy:start","delayed_job:start" ...
我想知道如何修改delayed_job_args来处理具有特定队列的1个worker,每个其他作业有1个worker.到目前为止,我所有的都是如此覆盖每个任务:
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
…但是没有乐趣有什么建议么?
解决方法
我将我的作业分成两个队列,一个工作者在我的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名称部分非常重要.这是允许多个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