Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我应该在哪里运行计划的后台作业?_Ruby On Rails_Amazon Web Services_Scheduled Tasks_Background Process_Aws Lambda - Fatal编程技术网

Ruby on rails 我应该在哪里运行计划的后台作业?

Ruby on rails 我应该在哪里运行计划的后台作业?,ruby-on-rails,amazon-web-services,scheduled-tasks,background-process,aws-lambda,Ruby On Rails,Amazon Web Services,Scheduled Tasks,Background Process,Aws Lambda,在我的公司里,我们经常在aws ebs中使用一些背景工作。问题是,这些工作开始变得越来越重,我们正在考虑将它们与应用程序分开。问题是:我们应该在哪里做 我们曾考虑在aws lambda中实现这一点,但随后我们必须将rails代码移植到python、node或java,这似乎需要大量的工作。还有什么其他选择?我们是否应该为这些工作创建另一个ec2环境?提前谢谢 编辑:我正在使用shoryuken gem:与SQS集成。但是它目前有一些内存泄漏,我的应用程序有时会崩溃,我不知道内存泄漏是否是原因。我

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

我们曾考虑在aws lambda中实现这一点,但随后我们必须将rails代码移植到python、node或java,这似乎需要大量的工作。还有什么其他选择?我们是否应该为这些工作创建另一个ec2环境?提前谢谢


编辑:我正在使用shoryuken gem:与SQS集成。但是它目前有一些内存泄漏,我的应用程序有时会崩溃,我不知道内存泄漏是否是原因。我们已经将应用程序分为EBS中的API部分和S3中的前端部分。

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


如果您需要更多的worker,只需添加更多指向同一Redis实例的EC2实例。我建议按队列名称将您的工作分开,这样一个工作人员就可以处理快速的事情,例如发送电子邮件,而其他人可以处理长时间运行或缓慢的工作。

我们有一个类似的要求,对我们来说是sidekiq后台工作,他们开始变得非常繁重,所以我们将其分成一个单独的opsworks堆栈,通过一个简单的方法来构建机器依赖项(ruby、mysql等),并且由于我们不必担心负载平衡器和请求超时,所以所有机器都可以同时部署

另外,您可以在opsworks中使用的另一件事是使用计划机器(如果在一天中的某些时间需要作业),在任务开始前几分钟将机器配置好,然后在任务完成后,您可以使其自动关闭,这将降低您的成本


eb也有不同类型的应用程序,这是工作者应用程序,您也可以检查它,但老实说,我还没有查看它,所以我不能告诉您有哪些利弊。

您可以考虑将作业提交给AWS SQL Services,然后,您可以使用elasticbeantaslk worker环境来处理积压的任务

Elasticbeanstalk支持钢轨应用:

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

这是一篇关于如何实现这一点的好文章


对于简单的邮件类型的东西,这肯定会让人感觉有点笨手笨脚,但是如果功能更复杂,例如,不同客户端的一般通知,那么这可能是值得的开销。

我们最近通过了这一途径。我停靠了rails应用程序,并编写了一个自定义入口点到docker容器。总之,在运行
docker run IMAGE\u NAME

例如:如果您运行:
docker run IMAGE\u NAME sb rake do some magical
entrypoint知道它将使用sandbox environment config运行rake作业。如果只运行:
docker run IMAGE\u NAME
它将运行
rails s-b0.0.0

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

我建立了一个ECS集群,在Lambda上编写了一个任务运行器作业。这个Lambda函数在ECS集群上调度一个任务,我们通过CloudWatch事件触发Lambda。使用CloudWatch事件时,可以向lambda发送自定义有效负载


这听起来很复杂,但实现起来很简单

是的,我忘了在问题中说。我正在使用shoryuken gem:与SQS集成。但是它目前有一些内存泄漏,我的应用程序有时会出现故障,我不知道内存泄漏是否是造成问题的原因。我们已经在EBS中的一个API部分中分离了应用程序,在S3中分离了一个前端部分…你能检查Shoryuken的最新版本吗?有一个已知内存泄漏问题的修补程序。