3

有用な情報があまり見つからないという質問があります。これが可能かどうか、もしそうなら、それをどのように実装するのが最善かを考えています。

バックグラウンドで大量のデータ処理を行うアプリをRailsで構築していますDelayedJob(…私たちにとってはうまく機能しています。)

アプリは AWS で実行され、Capistrano で構成されたいくつかの異なる環境があります。

処理負荷が高い場合、DelayedJobキューがバックアップされることがありますが、これはほとんど問題ありません。別のノードに傾向がある 1 つまたは 2 つのキューがあります。「詰まった」キューを無視するため、1 つまたは 2 つのキューを処理し続け、最新の状態を維持します。たとえば、個々のジョブには 1 時間以上かかるものもあり、次のワーカーがタスクを完了して優先ジョブを確認するまで、パスワードを忘れた場合の電子メールの配信が 90 分間保留されることは望ましくありません。

私が望むのは、2 つの異なる明示的なキューを処理する 1 つのワーカーを起動する個別の EC2 インスタンスを用意することです。

「--QUEUES」オプションを使用して 1 つまたは 2 つのワーカーを起動することにより、開発マシンでこれを手動で実行できます。

これが私の質問です。カピストラーノで新しいロールを定義し、そのロールのノードに異なる数のワーカーを開始して特定のキューを処理するように指示するにはどうすればよいですか? 繰り返しますが、通常のdelayed_jobs ロールは 3 ワーカーに設定され、すべてのキューを実行します。

これは可能ですか?より良い方法はありますか?

現在、Rails 3.2.13 と PostgreSQL 9.2 およびdelayed_jobgem を使用しています。

4

2 に答える 2

6

このコードを試してください - デフォルトの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

PSハッシュの単一の役割でのみテストしましたが、複数の役割も正常に機能するはずです。

于 2013-07-11T10:30:01.227 に答える