Capistrano有多个delayed_jobs角色?

时间:2013-07-03 18:02:29

标签: ruby-on-rails capistrano delayed-job rvm-capistrano

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

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

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

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

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

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

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

这可能吗?还有更好的方法吗?

目前在Rails 3.2.13上使用PostgreSQL 9.2和delayed_job gem。

2 个答案:

答案 0 :(得分: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

P.S。我只在哈希中使用单个角色对其进行了测试,但多个角色也应该正常工作。

答案 1 :(得分:0)

在Capistrano3中,使用官方的capistrano3-delayed-job宝石,您可以执行此操作而无需修改Capistrano方法:

# If you have several servers handling Delayed Jobs and you want to configure
# different pools per server, you can define delayed_job_pools_per_server:
#
# set :delayed_job_pools_per_server, {
#   'server11-prod' => {
#     'default,emails' => 3,
#     'loud_notifications' => 1,
#     'silent_notifications' => 1,
#   },
#   'server12-prod' => {
#     'default' => 2
#   }
# }

# Server names (server11-prod, server12-prod) in :delayed_job_pools_per_server
# must match the hostnames on Delayed Job servers. You can verify it by running
# `hostname` on your servers.

# If you use :delayed_job_pools_per_server, :delayed_job_pools will be ignored.