サーバーによってタスクを分離しておくために、delayed_job 内で名前付きキューを使用しています。
subdomain = Socket.gethostname.split('.')[0]
MyModel.delay(:queue => (subdomain + "_queue")).get_some_records
各サーバーでdelayed_jobを開始するとき、--queue
フラグを設定する必要があります。を使用して、delayed_job CL に引数を渡すことができますset :delayed_job_args
。私の知る限り、Capistrano では$CAPISTRANO:HOST$
inrun
コマンドを使用できますが、これはset
.
回避策として、delayed_jobs タスクを次のようにオーバーライドしました。
desc "Start the delayed_job process"
task :start, :roles => lambda { roles } do
run "cd #{current_path};#{rails_env} script/delayed_job start --queue=$CAPISTRANO:HOST$_queue #{args}"
end
を使用して、意図したとおりにこれを行う方法はありますset
か? 私はこのようなことができるようにしたいと思います:
set :delayed_job_args, "--queue=#{ hostname }_queue"
アップデート
これを行うための別の不器用な(そしてそれほどDRYではない)方法を発見しましたがset
、可能であればそれでもやりたいです:
desc "Start the delayed_job process"
task :start, :roles => lambda { roles } do
parallel do |session|
session.when "server.host =~ /server1/", "cd #{current_path};#{rails_env} script/delayed_job start --queue=server1_queue #{args}"
session.when "server.host =~ /server2/", "cd #{current_path};#{rails_env} script/delayed_job start --queue=server2_queue #{args}"
session.else "cd #{current_path};#{rails_env} script/delayed_job restart #{args}"
end
end
Rails 3.2.8、delayed_job 3.0.3、capistrano 2.13.4。