如何在AWS Elastic Beanstalk上运行Rails后台作业?

时间:2013-10-29 15:36:18

标签: ruby-on-rails amazon-web-services resque elastic-beanstalk

我刚开始在我的rails应用程序中使用AWS Elastic Beanstalk,我需要将Resque gem用于后台作业。然而,尽管我们都在努力搜索如何在Elastic Beanstalk上运行Resque worker,但我还是无法弄清楚如何?

How can I run Rails background jobs with Resque on AWS Elastic Beanstalk?谈到在Elastic Beanstalk容器中将它们作为服务运行,但是,它仍然非常令人困惑。

这里是我的ebextentions resque.config文件:

services: 
  sysvinit:
  resque_worker:
    enabled: true
    ensureRunning: true
    commands: 
      resque_starter: 
        rake resque:work QUEUE='*'

修改 现在我的resque.config文件如下所示:

container_commands:
  resque_starter: "rake resque:work QUEUE='*'"
services: 
  sysvinit:
    resque_worker:
      enabled: true
        ensureRunning: true
      commands: 
        resque_starter

它仍然不起作用。 编辑2

container_commands:
  resque_starter: 
    command: "rake resque:work QUEUE=sqs_message_sender_queue"
    cwd: /var/app/current/
    ignoreErrors: true

仍显示0名工人。

2 个答案:

答案 0 :(得分:9)

我认为在Elastic Beanstalk Web环境中运行队列(如Resque)并不是最理想的。 Web环境旨在托管Web应用程序,并在流量和负载增加时生成新实例。但是,拥有多个Resque队列是没有意义的,每个队列都运行在其中一个实例上。

Elastic Beanstalk提供worker environments,用于托管执行后台任务的代码。这些工作环境从Amazon SQS queue中拉出作业(这会产生额外的队列解决方案,如Resque,已过时)。 Amazon SQS队列可以轻松扩展,并且更易于维护(AWS只为您完成)。

使用Amazon SQS队列附带的工作环境更有意义,因为它支持开箱即用,非常适合Elastic Beanstalk环境。还有一个gem Active Elastic Job,它使Rails> = 4.2应用程序在工作环境中运行后台任务变得简单。

免责声明:我是Active Elastic Job的作者。

答案 1 :(得分:4)

首先,我建议在supervisord的帮助下运行resque,这将帮助您确保在进程死亡时重新启动worker。

关于每次部署时如何运行命令: 通过ssh登录到beanstalk实例转到文件夹:/ opt / elasticbeanstalk / hooks / appdeploy / 在这里,您将找到每次部署时执行的挂钩列表。此外,您可以放置​​自己的脚本,每次部署时都会执行。也可以使用相同的方法放置脚本 挂钩负责应用程序服务器重启并能够在没有ssh连接的情况下重新启动后台作业。

另一个选项是,启动后台工作程序的命令是使用container_commands而不是命令。

另外,请查看我发现的有关beanstalk自定义的最佳文章:http://www.hudku.com/blog/tag/elastic-beanstalk/这将是根据您的需要定制beanstalk环境的良好起点。 \