12

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

如何在 AWS Elastic Beanstalk 上使用 Resque 运行 Rails 后台作业?谈到在 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 个工人。

4

2 回答 2

12

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

Elastic Beanstalk 提供了旨在托管执行后台任务的代码的工作环境。这些工作人员环境从Amazon SQS 队列中提取作业(这使得其他队列解决方案,如 Resque,已过时)。Amazon SQS 队列可轻松扩展且更易于维护(AWS 只是为您完成)。

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

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

于 2016-01-07T21:02:05.760 回答
4

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

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

另一种选择,将启动后台工作人员的命令使用 container_commands 而不是命令。

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

于 2013-10-30T08:31:27.330 回答