2013-02-12 1 views
3

내 사이트에 Heroku에서 Unicorn 서버와 Delayed_Job을 사용하고 있습니다.Unicorn.rb, Heroku, Delayed_Job 구성

worker_processes 3 
preload_app true 
timeout 30 

# setting the below code because of the preload_app true setting above: 
# http://unicorn.bogomips.org/Unicorn/Configurator.html#preload_app-method 

@delayed_job_pid = nil 

before_fork do |server, worker| 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    Rails.logger.info('Disconnected from ActiveRecord') 
    # start the delayed_job worker queue in Unicorn, use " -n 2 " to start 2 workers 
    if Rails.env == "production" 
     # @delayed_job_pid ||= spawn("RAILS_ENV=production ../script/delayed_job start") 
     # @delayed_job_pid ||= spawn("RAILS_ENV=production #{Rails.root.join('script/delayed_job')} start") 
     @delayed_job_pid ||= spawn("bundle exec rake jobs:work") 
    elsif Rails.env == "development" 
     @delayed_job_pid ||= spawn("script/delayed_job start") 
     # @delayed_job_pid ||= spawn("rake jobs:work")  
    end 

    end 
end 

after_fork do |server, worker| 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    Rails.logger.info('Connected to ActiveRecord') 
    end 
end 
  • delayed_job :이 설치는 가장 좋은 방법 및 작업자 프로세스를 확인하는 방법에 대한 자세한 정보를 얻을 싶어하고 그러나 내가 확실 해요, 작동 등 내 설정/unicorn.rb 파일은 아래에 붙여 생산 모드에서 작업자 프로세스를 시작하는 데 RAILS_ENV=production script/delayed_job start을 사용한다고하지만이 명령을 사용하면 Heroku에서 "파일을 찾을 수 없음"오류가 발생합니다. 그래서, 지금은 생산을 위해 bundle exec rake jobs:work을 사용하고 있습니다. 작동하는 것으로 보이지만 정확합니까?
  • 실제로 얼마나 많은 프로세스가이 설정에서 실행되고 더 최적화 될 수 있습니까? 제 생각에 유니콘 마스터 프로세스 1 개, 웹 작업자 3 명, 지연된 작업자 1 명이 총 5 명입니다. 내가 dev 모드에서 로컬로 실행하면 5 루비 PID가 생성되는 것을 볼 수 있습니다. 아마도 2 명의 웹 작업자 만 사용하고 2 명의 작업자에게 Delayed_job을 제공하는 것이 좋습니다 (트래픽이 매우 적음)
  • 이 모든 작업은 단일 Heroku dyno에서 실행되므로 상태를 확인하는 방법을 모릅니다. 유니콘 노동자, 어떤 생각?

** 참고, 나는 Heroku가가이 같은

+0

본 게시물은 Resque에 도움이되지만 거래입니다. delayed_job을 사용하고 있습니다. http://stackoverflow.com/questions/11414321/rails-heroku-unicorn-resque-how-to-choose-the-amount-of-web-workers-resq – FireDragon

+0

다음 작업을 수행해야합니다. 작업자 dynos가 아니라 메인 웹 dyno : https://devcenter.heroku.com/articles/background-jobs-queueing – catsby

+0

@ctshryock 감사합니다. 게시하기 전에이 기사와 많은 내용을 읽었습니다. 당신이 알고 있는지 확신 할 수 없지만 많은 사람들이 단일 dyno 내에 여러 웹/작업자 프로세스를 생성 할 수 있도록 특별히 유니콘 웹 서버를 사용합니다. 나는 하나 이상의 dyno를 사용하는 것에 관심이 없으며, 단지 얇은 서버를 계속 사용하고 더 많은 웹 노동자를 구입했을 것입니다. 당신이 유니콘을 최적화하는 것에 대해 알고 있고 특히 모든 귀에는 heroku를 위해 unicorn.rb를 특별히 구성한다면. 감사! – FireDragon

답변

2

귀하의 config/unicorn.rb 산란 안되는 DJ 노동자 "파일을 찾을 수 없습니다"라는 있기 때문에 생산 현장을 깰 줄을 주석 처리했습니다. 당신은 너무처럼 Procfile에 별도의 작업자 프로세스를 지정해야합니다 :

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb 
worker: bundle exec rake jobs:work 

당신은 유니콘과 DJ 모두를 회전하는 지역 개발을위한 foreman를 사용할 수 있습니다. 내가 코멘트에, 당신은 당신이 얻을 결코 자식 프로세스를 산란하고 언급 한 바와 같이

worker_processes 3 
preload_app true 
timeout 30 

# setting the below code because of the preload_app true setting above: 
# http://unicorn.bogomips.org/Unicorn/Configurator.html#preload_app-method 

before_fork do |server, worker| 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    Rails.logger.info('Disconnected from ActiveRecord') 
    end 
end 

after_fork do |server, worker| 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    Rails.logger.info('Connected to ActiveRecord') 
    end 
end 

, 가능성 좀비가 될 것이다 : 당신의 결과 config/unicorn.rb 파일은 간단하다. 시도하고 계정을 작성하는 코드를 추가하더라도 단일 dynos가 여러 역할 (웹 및 백그라운드 작업자)을 수행하도록 시도하고 있으며 문제가 발생할 가능성이 있습니다 (메모리 오류 등).).

+0

하나의 dyno 또는 다중 dynos를 사용합니까? – Clay

+1

Procfile에 정의 된 각 프로세스는 크기가 조정되면 자체 dyno를 사용합니다. 예제 프로파일이 주어지면, web = 1 worker = 0은 1 dyno running입니다. 유니콘을 운영하는 웹 웹 다이노 (web dyno)는 그 자체로 3 명의 작업자 자식을 가지지 만 모두 하나의 웹 프로세스에 포함됩니다. 웹 = 2이고 작업자 = 2는 4 다이노스지만 유니콘은 6 명입니다. – catsby