2012-03-01 6 views
12

Sto cercando di utilizzare le code con delayed_job. Ho trovato this page che delinea vari modi di iniziare lavoratori, però mi piacerebbe tenere il mio momento metodo Capistrano:Avvio di più worker DelayedJob con code specifiche tramite le attività Capistrano

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

mi chiedevo come avrei potuto modificare le delayed_job_args per gestire la deposizione delle uova 1 lavoratore con una coda specifica e 1 lavoratore per ogni altro lavoro. Finora, tutto ciò che ho è ignorando ogni attività in questo modo:

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 

... Ma non è divertente. Eventuali suggerimenti?

risposta

4

Dopo un po 'di scherzi, il trucco che ho trovato è stato di tornare al' set: delayed_job_args 'e usare --queues = (plurale) invece di --queue = (singolare). Spero che questo aiuti chiunque altro che si imbatte nello stesso problema.

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

UPDATE: Quello che sto usando ora ...

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 
+0

Che proprio avvia 2 lavoratori che elaborano le stesse 2 code, vero? Non è quello che stavi chiedendo. – RocketR

+0

Non quello che speravo, no. Ma il meglio che ho potuto inventare in quel momento. –

+0

Capisco. Sono andato con un comando separato per ogni coda, come hai scritto nella domanda. Sembra che i compiti di capistrano dei DJ non siano adatti a più code. – RocketR

5

ho diviso i miei lavori in due code con un lavoratore isolato per ogni coda con questa configurazione nel mio file 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 

La parte -i name del comando è molto importante. Questa è la parte che consente l'esecuzione di più istanze di delayed_job.

Se si desidera aggiungere i lavoratori a code specifiche, allora si sarebbe espanderli come questo (dove ho due operai esclusivamente in coda uno, e un operaio esclusivamente sulla coda di due):

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