繁体   English   中英

Capistrano有多个delayed_jobs角色?

[英]Multiple delayed_jobs roles with Capistrano?

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

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

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

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

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

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

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

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

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

尝试此代码 - 在要求默认的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我只测试了哈希中的单个角色,但多个角色也应该正常工作。

在Capistrano3中,使用官方的capistrano3-delayed-job gem,您可以在不修改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.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM