我应该在哪里 运行 安排后台作业?
Where should I run scheduled background jobs?
在我的公司,我们在 aws ebs 中有一些常规应用程序和一些后台工作。问题是,这些工作开始变得越来越重,我们正在考虑将它们与应用程序分开。问题是:我们应该在哪里做?
我们曾考虑在 aws lambda 中执行此操作,但随后我们必须将我们的 rails 代码移植到 python、node 或 java,这似乎很多工作的。这还有什么其他选择?我们是否应该为作业创建另一个 ec2 环境?提前致谢。
编辑:我正在使用 shoryuken gem:http://github.com/phstc/shoryuken 与 SQS 集成。但它目前存在一些内存泄漏,我的应用程序有时会出现故障,我不知道内存泄漏是否是造成严重后果的原因。我们已经将应用程序分为 EBS 中的 API 部分和 S3 中的前端部分。
通常,只是另一个带有您的 Rails 应用程序副本的 EC2 实例,而不是 rails s
来启动 Web 服务器,您 运行 rake resque:work
或其他你的工作 运行ner 启动命令是。两者将共享相同的 Redis 实例和数据库,以便您的 Web 服务器将作业写入队列,然后工作人员将它们拾取并 运行s 它们。
如果您需要更多工作器,只需添加更多指向同一 Redis 实例的 EC2 实例即可。我建议按队列名称分隔您的工作,这样一个工作人员就可以处理快速的东西,例如电子邮件发送,其他人可以做长运行宁或慢工作。
我们有类似的要求,对我们来说是 sidekiq 后台作业,它们开始变得非常繁重,所以我们将它拆分到一个单独的 opsworks 堆栈中,使用一个简单的方法来构建机器依赖项(ruby, mysql, etc ), 由于我们不必担心负载均衡器和请求超时,所以所有机器同时部署是可以的。
您还可以在 opsworks 中使用的另一件事是使用预定的机器(如果一天中的特定时间需要作业),在任务开始前几分钟配置机器,然后在任务完成后完成后你可以让它自动关闭,这样可以降低你的成本。
EB也有一个不同类型的应用程序,就是worker应用程序,你也可以看看,但老实说我没有研究过,所以我不能告诉你它的优缺点是什么那。
您可以考虑将您的任务提交到 AWS SQS 服务,然后您可以使用 elasticbeantaslk worker 环境来处理您的后台任务。
Elasticbeanstalk 支持 rail 应用程序:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html
根据这些后台作业执行的工作类型,如果您 运行 您的作业在不同的实例上,您可能会考虑将这些功能提取到微服务中。
Here 是一个很好的 codeship 博客 post 关于如何处理这个问题。
对于简单的邮件类型的东西,这肯定感觉有点笨重,但如果功能更复杂,例如不同客户端的一般通知,这可能是值得的开销。
我们最近经过了那条路线。我 docker 化了我们的 rails 应用程序,并为该 docker 容器编写了一个自定义入口点。总之,入口点在 运行 docker run IMAGE_NAME
之后解析命令
例如:如果您 运行: docker run IMAGE_NAME sb rake do-something-magical
入口点知道它将 运行 rake job with sandbox envrionment config。如果你只 运行: docker run IMAGE_NAME
它会做 rails s -b 0.0.0.0
PS:我编写了自定义入口点,因为我们有 3 个不同的环境,该入口点从 s3 下载特定于环境的配置。
然后我设置了一个 ECS 集群,在 Lambda 上编写了一个任务-运行ner 作业,这个 lambda 函数在 ecs 集群上安排了一个任务,我们从 CloudWatch Events 触发了那个 lambda。使用 CloudWatch Events 时,您可以将自定义负载发送到 lambda。
听起来很复杂,但实现起来很简单。
在我的公司,我们在 aws ebs 中有一些常规应用程序和一些后台工作。问题是,这些工作开始变得越来越重,我们正在考虑将它们与应用程序分开。问题是:我们应该在哪里做?
我们曾考虑在 aws lambda 中执行此操作,但随后我们必须将我们的 rails 代码移植到 python、node 或 java,这似乎很多工作的。这还有什么其他选择?我们是否应该为作业创建另一个 ec2 环境?提前致谢。
编辑:我正在使用 shoryuken gem:http://github.com/phstc/shoryuken 与 SQS 集成。但它目前存在一些内存泄漏,我的应用程序有时会出现故障,我不知道内存泄漏是否是造成严重后果的原因。我们已经将应用程序分为 EBS 中的 API 部分和 S3 中的前端部分。
通常,只是另一个带有您的 Rails 应用程序副本的 EC2 实例,而不是 rails s
来启动 Web 服务器,您 运行 rake resque:work
或其他你的工作 运行ner 启动命令是。两者将共享相同的 Redis 实例和数据库,以便您的 Web 服务器将作业写入队列,然后工作人员将它们拾取并 运行s 它们。
如果您需要更多工作器,只需添加更多指向同一 Redis 实例的 EC2 实例即可。我建议按队列名称分隔您的工作,这样一个工作人员就可以处理快速的东西,例如电子邮件发送,其他人可以做长运行宁或慢工作。
我们有类似的要求,对我们来说是 sidekiq 后台作业,它们开始变得非常繁重,所以我们将它拆分到一个单独的 opsworks 堆栈中,使用一个简单的方法来构建机器依赖项(ruby, mysql, etc ), 由于我们不必担心负载均衡器和请求超时,所以所有机器同时部署是可以的。
您还可以在 opsworks 中使用的另一件事是使用预定的机器(如果一天中的特定时间需要作业),在任务开始前几分钟配置机器,然后在任务完成后完成后你可以让它自动关闭,这样可以降低你的成本。
EB也有一个不同类型的应用程序,就是worker应用程序,你也可以看看,但老实说我没有研究过,所以我不能告诉你它的优缺点是什么那。
您可以考虑将您的任务提交到 AWS SQS 服务,然后您可以使用 elasticbeantaslk worker 环境来处理您的后台任务。
Elasticbeanstalk 支持 rail 应用程序: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html
根据这些后台作业执行的工作类型,如果您 运行 您的作业在不同的实例上,您可能会考虑将这些功能提取到微服务中。
Here 是一个很好的 codeship 博客 post 关于如何处理这个问题。
对于简单的邮件类型的东西,这肯定感觉有点笨重,但如果功能更复杂,例如不同客户端的一般通知,这可能是值得的开销。
我们最近经过了那条路线。我 docker 化了我们的 rails 应用程序,并为该 docker 容器编写了一个自定义入口点。总之,入口点在 运行 docker run IMAGE_NAME
例如:如果您 运行: docker run IMAGE_NAME sb rake do-something-magical
入口点知道它将 运行 rake job with sandbox envrionment config。如果你只 运行: docker run IMAGE_NAME
它会做 rails s -b 0.0.0.0
PS:我编写了自定义入口点,因为我们有 3 个不同的环境,该入口点从 s3 下载特定于环境的配置。
然后我设置了一个 ECS 集群,在 Lambda 上编写了一个任务-运行ner 作业,这个 lambda 函数在 ecs 集群上安排了一个任务,我们从 CloudWatch Events 触发了那个 lambda。使用 CloudWatch Events 时,您可以将自定义负载发送到 lambda。
听起来很复杂,但实现起来很简单。