[英]Multiple delayed_jobs roles with Capistrano?
我有一個問題,我沒有找到有用的信息。 我想知道這是否可能,如果是的話,如何最好地實現它。
我們正在Rails中構建一個應用程序,它通過DelayedJob
在后台進行大量數據處理(...它對我們來說效果很好。)
該應用程序在AWS中運行,我們在Capistrano中配置了一些不同的環境。
當我們有大量處理負載時,我們的DelayedJob
隊列可以備份 - 這幾乎沒問題。 我確實有一兩個隊列,我希望有一個單獨的節點。 因為它會忽略“堵塞”的隊列,所以它會保持一兩個隊列,並保持最新狀態。 例如,一些單獨的工作可能需要一個多小時,我不希望忘記密碼 - 電子郵件傳遞被暫停90分鍾,直到下一個工作人員完成任務並檢查優先工作。
我想要的是有一個單獨的EC2實例,它有一個工作程序啟動,往往有兩個不同的顯式隊列。
我可以通過使用'--QUEUES'選項啟動一個或兩個工作人員在我的開發機器上手動完成此操作。
這是我的問題,如何在capistrano中定義一個新角色並告訴該角色的節點啟動不同數量的工作者並傾向於特定隊列? 同樣,我正常的delayed_jobs角色設置為3個worker並運行所有隊列。
這可能嗎? 有沒有更好的辦法?
目前在Rails 3.2.13上使用PostgreSQL 9.2和delayed_job
gem。
嘗試此代碼 - 在要求默認的delayed_job配方后將其放在deploy.rb中。
# This overrides default delayed_job tasks to support args per role
# If you want to use command line options, for example to start multiple workers,
# define a Capistrano variable delayed_job_args_per_role:
#
# set :delayed_job_args_per_role, {:worker_heavy => "-n 4",:worker_light => "-n 1" }
#
# Target server roles are taken from delayed_job_args_per_role keys.
namespace :delayed_job do
def args_per_host(host)
roles.each do |role|
find_servers(:roles => role).each do |server|
return args[role] if server.host == host
end
end
end
def args
fetch(:delayed_job_args_per_role, {:app => ""})
end
def roles
args.keys
end
desc "Start the delayed_job process"
task :start, :roles => lambda { roles } do
find_servers_for_task(current_task).each do |server|
run "cd #{current_path};#{rails_env} script/delayed_job start #{args_per_host server.host}", :hosts => server.host
end
end
desc "Restart the delayed_job process"
task :restart, :roles => lambda { roles } do
find_servers_for_task(current_task).each do |server|
run "cd #{current_path};#{rails_env} script/delayed_job restart #{args_per_host server.host}", :hosts => server.host
end
end
end
PS我只測試了哈希中的單個角色,但多個角色也應該正常工作。
在Capistrano3中,使用官方的capistrano3-delayed-job gem,您可以在不修改Capistrano方法的情況下執行此操作:
# If you have several servers handling Delayed Jobs and you want to configure
# different pools per server, you can define delayed_job_pools_per_server:
#
# set :delayed_job_pools_per_server, {
# 'server11-prod' => {
# 'default,emails' => 3,
# 'loud_notifications' => 1,
# 'silent_notifications' => 1,
# },
# 'server12-prod' => {
# 'default' => 2
# }
# }
# Server names (server11-prod, server12-prod) in :delayed_job_pools_per_server
# must match the hostnames on Delayed Job servers. You can verify it by running
# `hostname` on your servers.
# If you use :delayed_job_pools_per_server, :delayed_job_pools will be ignored.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.