【问题标题】:How can I run Rails background jobs on AWS Elastic Beanstalk?如何在 AWS Elastic Beanstalk 上运行 Rails 后台作业?
【发布时间】:2013-11-08 20:57:34
【问题描述】:

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

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 个工人。

【问题讨论】:

  • 我建议使用 container_commands 而不是命令。
  • 令我困惑的是如何在每次部署后自动运行“rake resque:work QUEUE='*'”命令,如果它是活着的,杀死并重新运行?我希望它更具体
  • @Omer,你知道如何在 EB 上持久化 Resque 工作人员吗?

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


【解决方案1】:

我认为在 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的作者。

【讨论】:

  • 当您只想在每台服务器上执行小的周期性任务时,工作环境似乎是疯狂的矫枉过正。
  • 在生产中很少需要“小型周期性任务”。如果您希望它是可靠的,即使是发送电子邮件的非常常见的要求也几乎需要一个工作环境。
【解决方案2】:

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

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

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

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

【讨论】:

  • 不知能否详细说明container_commands的使用方法?文档表明它们是在部署应用程序版本之前运行的,如果是这种情况,我看不出它们会有什么用处。
  • 好吧,如果您需要在提取应用程序之前执行一些操作,则命令很有用,此时 Web 服务器正在运行。从过期开始,它们在新服务器上执行一次。 container_commands - 提取应用程序时,但在部署应用程序之前。
猜你喜欢
  • 2013-01-10
  • 2016-11-25
  • 2013-05-06
  • 2016-11-28
  • 2016-11-26
  • 2019-03-14
  • 2014-12-26
  • 2017-04-20
  • 2021-08-22
相关资源
最近更新 更多