2013-07-03 4 views
2

나는 많은 유용한 정보를 찾지 못하고 있다는 의문을 가지고 있습니다. 가능한지 궁금해지며, 그렇다면 어떻게 구현해야하는지 궁금합니다.Capistrano와 함께 delayed_jobs 역할이 여러 개 있습니까?

우리는 AWS에서 (. 그것은 우리를 위해 잘 작동 ...) DelayedJob를 통해

앱 실행을 백그라운드에서 무거운 데이터 처리가 레일에서 응용 프로그램을 구축하고 우리는 몇 가지 다른 환경에 구성되어 카피 스트라 노.

처리 부하가 많은 경우 DelayedJob 대기열을 백업 할 수 있습니다. 이는 대부분 괜찮습니다. 별도의 노드를 갖고 싶어하는 하나 또는 두 개의 대기열이 있습니다. '막힌'대기열을 무시할 것이므로 하나 또는 두 개의 대기열을 돌봐 주면 현재 상태로 유지됩니다. 예를 들어, 일부 개별 작업은 한 시간 이상 걸릴 수 있으며 다음 작업자가 작업을 완료하고 우선 순위 작업을 확인할 때까지 잊어 버린 비밀번호 이메일 배달을 90 분 동안 유지하지 않으려 고합니다.

내가 원하는 것은 두 개의 서로 다른 명시 적 대기열을 사용하는 한 명의 작업자가 시작된 별도의 EC2 인스턴스를 갖는 것입니다.

'- QUEUES'옵션을 사용하여 한두 명의 작업자를 시작하여 직접 내 컴퓨터에서이 작업을 수행 할 수 있습니다.

여기 내 질문이 있습니다. 어떻게 카피 스트라 노에서 새로운 역할을 정의하고 그 역할의 노드에 다른 수의 직원을 시작하여 특정 대기열을 사용하도록 할 수 있습니까? 다시 말하지만, 통상적 인 delayed_jobs 역할은 3 명의 작업자로 설정되고 모든 대기열을 실행합니다.

이것이 가능합니까? 더 좋은 방법이 있습니까?

현재 Rails 3.2.13에서 PostgreSQL 9.2 및 delayed_job 보석을 사용하고 있습니다.

답변

4

기본 코드를 요청한 후에 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. 해시에서 단일 역할 만 테스트했지만 여러 역할도 제대로 작동합니다.

+0

이것은 내가 찾고있는 것입니다. 고맙습니다. – n8gard