Capistrano有多个delayed_jobs角色?

n8g*_*ard 3 capistrano ruby-on-rails delayed-job rvm-capistrano

我有一个问题,我没有找到有用的信息.我想知道这是否可能,如果是的话,如何最好地实现它.

我们正在Rails中构建一个应用程序,它通过后台进行大量的数据处理DelayedJob(...它对我们来说效果很好.)

该应用程序在AWS中运行,我们在Capistrano中配置了一些不同的环境.

当我们有大量的处理负载时,我们的DelayedJob队列可以备份 - 这大部分都很好.我确实有一两个队列,我希望有一个单独的节点.因为它会忽略"堵塞"的队列,所以它会保持一两个队列,并保持最新状态.例如,某些单独的工作可能需要一个多小时,我不希望忘记密码 - 电子邮件传递被暂停90分钟,直到下一个工作人员完成任务并检查优先工作.

我想要的是有一个单独的EC2实例,它有一个工作程序启动,往往有两个不同的显式队列.

我可以通过使用'--QUEUES'选项启动一个或两个工作人员在我的开发机器上手动执行此操作.

这是我的问题,如何在capistrano中定义一个新角色并告诉该角色的节点启动不同数量的工作者并倾向于特定队列?同样,我正常的delayed_jobs角色设置为3个worker并运行所有队列.

这可能吗?有没有更好的办法?

目前在Rails 3.2.13上使用PostgreSQL 9.2和delayed_jobgem.

bio*_*cer 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
Run Code Online (Sandbox Code Playgroud)

PS我只测试了哈希中的单个角色,但多个角色也应该正常工作.