简体   繁体   English

Capistrano有多个delayed_jobs角色?

[英]Multiple delayed_jobs roles with Capistrano?

I have a question that I am not finding much useful information for. 我有一个问题,我没有找到有用的信息。 I'm wondering if this is possible and, if so, how to best implement it. 我想知道这是否可能,如果是的话,如何最好地实现它。

We are building an app in Rails which has heavy data-processing in the background via DelayedJob (…it is working well for us.) 我们正在Rails中构建一个应用程序,它通过DelayedJob在后台进行大量数据处理(...它对我们来说效果很好。)

The app runs in AWS and we have a few different environments configured in Capistrano. 该应用程序在AWS中运行,我们在Capistrano中配置了一些不同的环境。

When we have heavy processing loads, our DelayedJob queues can back up--which is mostly fine. 当我们有大量处理负载时,我们的DelayedJob队列可以备份 - 这几乎没问题。 I do have one or two queues that I'd like to have a separate node tend to. 我确实有一两个队列,我希望有一个单独的节点。 Since it would be ignoring the 'clogged' queues, it would keep tending its one or two queues and they would stay current. 因为它会忽略“堵塞”的队列,所以它会保持一两个队列,并保持最新状态。 For example, some individual jobs can take over an hour and I wouldn't want a forgotten-password-email delivery to be held up for 90 minutes until the next worker completes a task and checks for a priority job. 例如,一些单独的工作可能需要一个多小时,我不希望忘记密码 - 电子邮件传递被暂停90分钟,直到下一个工作人员完成任务并检查优先工作。

What I want is to have a separate EC2 instance that has one worker launched that tends to two different, explicit queues. 我想要的是有一个单独的EC2实例,它有一个工作程序启动,往往有两个不同的显式队列。

I can do this manually on my dev machine by launching one or two workers with the '--QUEUES' option. 我可以通过使用'--QUEUES'选项启动一个或两个工作人员在我的开发机器上手动完成此操作。

Here is my question, how can I define a new role in capistrano and tell that role's nodes to start a different number of workers and tend to specific queues? 这是我的问题,如何在capistrano中定义一个新角色并告诉该角色的节点启动不同数量的工作者并倾向于特定队列? Again, my normal delayed_jobs role is set to 3 workers and runs all queues. 同样,我正常的delayed_jobs角色设置为3个worker并运行所有队列。

Is this possible? 这可能吗? Is there a better way? 有没有更好的办法?

Presently on Rails 3.2.13 with PostgreSQL 9.2 and the delayed_job gem. 目前在Rails 3.2.13上使用PostgreSQL 9.2和delayed_job gem。

Try this code - place it in deploy.rb after requiring default delayed_job recipes. 尝试此代码 - 在要求默认的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 I've tested it only with single role in hash, but multiple roles should work fine too. PS我只测试了哈希中的单个角色,但多个角色也应该正常工作。

In Capistrano3, using the official capistrano3-delayed-job gem, you can do this without modifying the Capistrano methods: 在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