我刚开始在我的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名工人。
答案 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环境的良好起点。 \