2013-07-03 64 views
2

我有一個問題,我沒有找到很多有用的信息。我想知道這是否可行,如果是的話,如何最好地實施它。Capistrano的多個delayed_jobs角色?

我們在AWS通過DelayedJob建設的Rails應用程序具有繁重的數據處理在後臺(...這是對我們工作的很好。)

的應用程序運行,我們在配置幾個不同的環境Capistrano的。

當我們有大的處理負荷,我們DelayedJob隊列可以備份 - 其中大部分是罰款。我確實有一個或兩個隊列,我希望有一個單獨的節點傾向於。由於它會忽略「堵塞」的隊列,它會繼續撫摸它的一兩個隊列,並保持最新狀態。例如,某些個人工作可能需要一個小時以上,並且我不希望忘記密碼電子郵件遞送90分鐘,直到下一個工作人員完成任務並檢查優先工作。

我想要的是有一個具有一個工人發起傾向於兩種不同的,明確的隊列單獨的EC2實例。

我可以手動我的開發機器上通過啓動一個或兩個工人用「--QUEUES」選項做到這一點。

這裏是我的問題,我怎麼能在Capistrano的定義一個新的角色,並告訴該角色的節點來啓動不同數量的工人,並傾向於特定隊列?同樣,我的普通delayed_jobs角色設置爲3名工作人員並運行所有隊列。

這可能嗎?有沒有更好的辦法?

目前更多PostgreSQL 9.2 Rails的3.2.13和delayed_job寶石。

回答

4

試試這個代碼 - 在需要默認的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 

P.S.我已經用散列中的單個角色對它進行了測試,但是多個角色也應該可以正常工作。

+0

這正是我一直在尋找的。謝謝。 – n8gard