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



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

目前,我们的 Web 进程和 sidekiq 进程在相同的 EC2 实例上运行。这意味着我们需要使用更大的实例来支持此过程。我们希望迁移到单独的 Web 和 worker 架构。想法是在EC2小型实例上移动Web进程,并拥有一个仅专用于Sidekiq的EC2大型实例。 这样做的原因是我们有 CPU 使用率问题,其中较大的工作线程作业占用所有资源并关闭实例,这比新实例中的多米诺骨牌要好,而且通常不是我们资源的最佳使用。

这对我们来说似乎不费吹灰之力,但我们很难找到已实现此功能的 Web 资源。此外,我们分别设置 Web EB 应用程序和 Worker EB 应用程序也会感到困惑。部署将如何工作,我们会同时部署两个独立的EB应用程序吗?这似乎并不安全。

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

还有更好的方法吗?

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

  1. 创建新应用程序。
  2. 在应用程序中创建 Web 服务器环境(例如"生产"(。
  3. 在应用程序中创建工作线程环境(例如"生产-工作线程"(。
  4. 在生产环境中设置环境变量,例如APP_ENVIRONMENT(此名称可以是您选择的任何名称(,值为"生产",在生产工作线程环境中设置值"生产-工作人员"。
  5. .ebextensions创建配置文件以启动/停止 sidekiq(以及工作线程所需的任何其他程序(,具体取决于APP_ENVIRONMENT变量名称是否与"worker"匹配。
  6. 为后台作业设置cron.yaml文件(请参阅 AWS 文档(。
  7. 对于后台作业,我为cron.yaml文件中列出的端点创建了一个单独的 cron 控制器。
  8. 将代码库部署到 Web 服务器和辅助角色环境。后续更改可以根据需要部署到相应的环境。

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