AWS run Rails应用程序的架构指导(Web / Worker设置)

问题描述 投票:-1回答:1

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

目前,我们的Web进程和sidekiq进程正在同一EC2实例上运行。这意味着我们需要使用更大的实例来支持此过程。我们想转移到单独的Web和工作人员架构。想法是在EC2小型实例上移动Web进程,并使一个EC2大型实例仅专用于Sidekiq。原因是我们遇到了CPU使用率问题,其中较大的工作作业会占用所有资源,并导致实例失效,这比新实例中的多米诺骨牌(通常不是我们资源的最佳使用)。

这对我们来说似乎不费吹灰之力,但是我们很难在实施此资源的地方找到网络资源。同样,这也使我们混淆分别设置Web EB应用程序和Worker EB应用程序。如何部署工作,我们是否会同时部署两个单独的EB应用程序?这似乎并不安全。

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

还有一种更好的方法吗?

ruby-on-rails amazon-web-services amazon-ec2 sidekiq amazon-elastic-beanstalk
1个回答
0
投票

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

  1. 创建一个新的应用程序。
  2. 在应用程序中创建Web服务器环境(例如“生产”)。
  3. 在应用程序中创建工作环境(例如“生产工作人员”)。
  4. [在生产环境中使用值“ production”设置生产环境变量,例如APP_ENVIRONMENT(此名称可以是您选择的任何名称),而在生产工人环境中设置其值为“ production-worker”。
  5. 根据.ebextensions变量名称是否匹配“ worker”,在APP_ENVIRONMENT中创建配置文件以启动/停止sidekiq(以及worker所需的任何其他程序。)>
  6. 为后台作业设置cron.yaml文件(请参见AWS docs)。
  7. 对于后台作业,我为cron.yaml文件中列出的端点创建了单独的cron控制器。
  8. 将您的代码库同时部署到Web服务器和工作者环境。随后的更改可以根据需要部署到适当的环境。
  9. 对于Sidekiq,您的Web应用程序和您的工作人员都需要被授予对Redis服务器的访问权限,因此您的应用程序可以创建作业,然后该工作人员可以将其提取以进行处理。

© www.soinside.com 2019 - 2024. All rights reserved.