AWS 运行 Rails 应用程序的架构指南(Web/Worker 设置)

Posted

技术标签:

【中文标题】AWS 运行 Rails 应用程序的架构指南(Web/Worker 设置)【英文标题】:Architecture guidance for AWS run Rails app (Web/Worker setup) 【发布时间】:2020-01-25 09:59:59 【问题描述】:

我们在 AWS 上托管应用程序并使用 EB (ElasticBeanstalk) 进行部署。应用程序是 Rails,我们将 Sidekiq 用于后台进程。我们已经解耦了 RDS 实例、ElasticCache(用于 Sidekiq 通信),一般来说,我们是无状态架构。

目前,我们的 Web 进程和 sidekiq 进程在相同的 EC2 实例上运行。这意味着我们需要使用更大的实例来支持这个过程。我们希望转向分离的 web 和 worker 架构。想法是在 EC2 小型实例上移动 Web 进程,并让一个 EC2 大型实例专用于 Sidekiq。造成这种情况的原因是我们遇到了 CPU 使用问题,其中较大的工作作业占用了所有资源并将实例关闭,这比新实例中的多米诺骨牌和一般不是我们资源的最佳使用。

这对我们来说似乎很容易,但我们很难找到已实现此功能的网络资源。此外,单独设置 Web EB 应用程序和 Worker EB 应用程序让我们感到困惑。部署将如何工作,我们会同时部署两个单独的 EB 应用程序吗?这似乎不安全。

我们正在寻找有关如何最好地实现上述目标的指导,您是否可以分享一些示例或设置,我们可以在其中看到这方面的真实示例?

还有更好的方法吗?

【问题讨论】:

【参考方案1】:

您为 Rails 应用程序描述的 web/worker 设置是绝对合适的。在同一个应用程序中,您可以为您的 Web 服务器创建一个环境,并为您的工作人员创建一个环境。您的代码库可以单独部署到两个环境(如果您的更改仅影响工作人员或 Web 服务器),也可以同时部署(如果您的更改影响两个环境)。您可以设置特定于您的环境的环境变量,您可以使用这些变量来确定代码应该在工作人员还是 Web 服务器上运行。以下是您可以使用的步骤的简要概述:

    创建一个新应用程序。 在应用程序中创建一个 Web 服务器环境(例如“生产”)。 在应用程序中创建工作环境(例如“production-worker”)。 在生产环境中设置一个环境变量,例如APP_ENVIRONMENT(此名称可以是您选择的任何名称),其值为“production”,并在生产工人环境中设置为“production-worker”。 根据APP_ENVIRONMENT 变量名称是否与“worker”匹配,在.ebextensions 中创建配置文件以启动/停止sidekiq(以及worker 所需的任何其他程序)。 为后台作业设置cron.yaml 文件(请参阅AWS docs)。 对于后台作业,我为cron.yaml 文件中列出的端点创建了一个单独的 cron 控制器。 将您的代码库部署到 Web 服务器和工作环境。可以根据需要将后续更改部署到适当的环境。

对于 Sidekiq,您的 Web 应用程序和您的工作人员都需要获得对 Redis 服务器的访问权限,以便您的应用程序可以创建作业,然后工作人员可以接手处理它们。

【讨论】:

嗨@haris-krajina,您是否能够在AWS 上为您的Rails 应用程序设置上述架构。如果是,您是如何实现的?我有相同的要求,但使用 Resque。

以上是关于AWS 运行 Rails 应用程序的架构指南(Web/Worker 设置)的主要内容,如果未能解决你的问题,请参考以下文章

Rails 应用程序无法在 AWS Elastic Beanstalk 上运行,sqlite3 错误

如何在 AWS Elastic Beanstalk 上使用 Resque 运行 Rails 后台作业?

运行 Puma 和 Nginx 的带有 AWS Elastic Beanstalk 的 Rails 应用程序 502

在 AWS Elastic Beanstalk 上部署 rails 应用程序

使用 AWS Elastic Beanstalk 部署 rails 应用程序时管理迁移

AWS Elastic Beanstalk Rails Bundler 失败