我应该在哪里运行预定的后台工作?

时间:2016-11-04 13:49:20

标签: ruby-on-rails amazon-web-services scheduled-tasks background-process aws-lambda

在我的公司,我们在aws ebs中定期应用一些后台工作。问题是,这些工作开始变得越来越重,我们正在考虑将它们与应用程序分开。问题是:我们应该在哪里做?

我们正在考虑在aws lambda中执行它,但是我们必须将rails代码移植到python,node或java,这似乎是很多工作。这有什么其他选择?我们应该为这些工作创造另一个ec2环境吗?提前致谢。

编辑:我正在使用shoryuken gem:http://github.com/phstc/shoryuken与SQS集成。但它目前有一些内存泄漏,我的应用程序有时会下降,我不知道内存泄漏是否是导致困难的原因。我们已经在EBS中的API部分和S3中的前端部分之间分离了应用程序。

5 个答案:

答案 0 :(得分:3)

通常,只是另一个带有Rails应用程序副本的EC2实例,而不是rails s来启动Web服务器,而是运行rake resque:work或任何作业运行器启动命令。两者都将共享相同的Redis实例和数据库,以便您的Web服务器将作业写入队列,然后工作人员将其拾取并运行它们。

如果您需要更多工作人员,只需添加指向同一Redis实例的更多EC2实例。我建议按队列名称分隔你的工作,以便一个工人可以只处理快速的东西,例如电子邮件发送,其他人可以做长时间运行或慢速工作。

答案 1 :(得分:1)

我们有类似的要求,对于我们来说是sidekiq后台工作,他们开始变得非常沉重,所以我们把它拆分成一个单独的opsworks堆栈,用一个简单的方法来构建机器依赖(ruby,mysql等) ),因为我们不必担心负载均衡器和请求超时,所以所有机器都可以同时部署。

您可以在opsworks中使用的另一件事是使用预定的计算机(如果在白天的某些时间需要作业),让计算机在任务开始前几分钟进行预配置,然后在任务完成后再使用你可以让它自动关闭,这会降低你的成本。

EB还有一个不同类型的应用程序,即工作者应用程序,你也可以检查出来,但老实说我还没有调查过,所以我不能告诉你它的优点和缺点。

答案 2 :(得分:1)

我们最近通过了这条路线。我将我们的rails应用程序停靠,并为该docker容器编写了一个自定义入口点。总之,在运行docker run IMAGE_NAME

之后,entrypoint会解析命令

例如:如果您运行:docker run IMAGE_NAME sb rake do-something-magical入口点了解它将使用sandbox envrionment config运行rake作业。如果你只运行:docker run IMAGE_NAME它会rails s -b 0.0.0.0

PS:我写了自定义入口点,因为我们有3个不同的环境,入口点从s3下载环境特定的配置。

我建立了一个ECS集群,在Lambda上编写了一个任务运行工作,这个lambda函数在ecs集群上安排了一个任务,我们从CloudWatch Events触发了lambda。使用CloudWatch Events时,您可以将自定义有效负载发送到lambda。

听起来很复杂,但实施起来非常简单。

答案 3 :(得分:0)

您可以考虑将您的任务提交给AWS SQS服务,然后您可以使用elasticbeantaslk工作人员环境来处理您的后台任务。

Elasticbeanstalk支持铁路应用: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html

答案 4 :(得分:0)

根据这些后台作业执行的工作类型,如果您在差异实例上运行作业,可能需要考虑将这些功能提取到微服务中。

Here是关于如何处理此问题的优秀代码博客文章。

对于简单的邮件类型的东西,这肯定感觉有点沉重,但如果功能更复杂,例如不同客户的一般通知,可能是值得的开销。