3

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

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

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

当我们有繁重的处理负载时,我们的DelayedJob队列可以备份——这基本上没问题。我确实有一个或两个队列,我希望有一个单独的节点来处理。由于它会忽略“阻塞”的队列,它会继续处理它的一两个队列并且它们会保持最新状态。例如,一些单独的工作可能需要一个多小时,而我不希望忘记密码的电子邮件发送被推迟 90 分钟,直到下一个工作人员完成任务并检查优先工作。

我想要的是有一个单独的 EC2 实例,它启动了一个工作人员,该工作人员倾向于两个不同的显式队列。

我可以在我的开发机器上手动执行此操作,方法是使用“--QUEUES”选项启动一两个工人。

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

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

目前在带有 PostgreSQL 9.2 和delayed_jobgem 的 Rails 3.2.13 上。

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 回答
0

在 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.
于 2018-10-31T02:45:14.130 回答