【问题标题】:Multiple delayed_jobs roles with Capistrano?Capistrano 的多个延迟工作角色?
【发布时间】:2013-07-01 13:34:48
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    试试这个代码 - 在需要默认的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
    

    附:我仅在哈希中使用单个角色对其进行了测试,但多个角色也应该可以正常工作。

    【讨论】:

    • 这正是我想要的。谢谢。
    【解决方案2】:

    在 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.
    

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2011-05-14
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      相关资源
      最近更新 更多