3

私のサイトでは、Heroku で Unicorn サーバーと Delayed_Job を正常に使用しています。ただし、それが最善の方法でセットアップされているかどうかは不明であり、ワーカープロセスの表示方法などに関する詳細情報を取得したいと考えています。動作する config/unicorn.rb ファイルを以下に貼り付けます。

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 はRAILS_ENV=production script/delayed_job start、プロダクション モードでワーカー プロセスを開始するために使用するように指示されていますが、このコマンドを使用すると、Heroku で「ファイルが見つかりません」というエラーが発生します。それで、今のところ私はbundle exec rake jobs:work本番環境で使用していますが、これはうまくいくようですが、これは正しいですか?
  • このセットアップで実際に実行されているプロセスの数は? 私の推測では、Unicorn マスター プロセスが 1 つ、Web ワーカーが 3 つ、遅延ジョブ ワーカーが 1 つ、合計 5 つでしょうか。ローカルで dev モードで実行すると、5 つの ruby​​ pid が生成されていることがわかります。おそらく、2 つの Web ワーカーのみを使用し、Delayed_job に 2 つのワーカーを与える方がよいでしょう (トラフィックがかなり少ない)。
  • これらはすべて単一の Heroku dyno で実行されるため、Unicorn ワーカーのステータスを確認する方法がわかりません。

**注、Heroku が「ファイルが見つからない」と言っているため、本番環境でサイトを壊す行をコメントアウトしました

4

1 に答える 1

3

config/unicorn.rbこのような DJ ワーカーを生成するべきではありません。Procfile次のように、別のワーカー プロセスを指定する必要があります。

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

foremanUnicorn と DJ の両方をスピンアップするローカル開発に使用できます。結果のconfig/unicorn.rbファイルはより単純になります。

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

コメントで述べたように、取得することのない子プロセスを生成しているため、ゾンビになる可能性があります。それを説明するためにコードを追加したとしても、単一の dyno に複数の役割 (Web およびバックグラウンド ワーカー) を実行させようとしており、将来的に問題が発生する可能性があります (メモリ エラーなど)。 )。

于 2013-02-13T14:36:44.310 に答える