我们正在AWS上托管应用程序,并且正在使用EB(ElasticBeanstalk)进行部署。应用程序是Rails,我们将Sidekiq用于后台进程。我们已经解耦了RDS实例ElasticCache(用于Sidekiq通信),并且通常来说,我们是无状态架构。
目前,我们的Web进程和sidekiq进程正在同一EC2实例上运行。这意味着我们需要使用更大的实例来支持此过程。我们想转移到单独的Web和工作人员架构。想法是在EC2小型实例上移动Web进程,并使一个EC2大型实例仅专用于Sidekiq。原因是我们遇到了CPU使用率问题,其中较大的工作作业会占用所有资源,并导致实例失效,这比新实例中的多米诺骨牌(通常不是我们资源的最佳使用)。
这对我们来说似乎不费吹灰之力,但是我们很难在实施此资源的地方找到网络资源。同样,这也使我们混淆分别设置Web EB应用程序和Worker EB应用程序。如何部署工作,我们是否会同时部署两个单独的EB应用程序?这似乎并不安全。
我们正在寻找有关如何最好地实现上述目标的指南,是否有您可以共享的示例或设置,我们可以在其中看到真实的示例?
还有一种更好的方法吗?
您为Rails应用程序描述的Web /工作程序设置绝对合适。在同一应用程序中,您可以为Web服务器和工作人员创建环境。您的代码库既可以单独部署(如果更改仅影响工作服务器或Web服务器),也可以同时部署(如果更改影响两个环境)。您可以设置特定于您的环境的环境变量,可用于确定代码应在工作服务器还是Web服务器上运行。这是您可以使用的步骤的简要概述:
APP_ENVIRONMENT
(此名称可以是您选择的任何名称),而在生产工人环境中设置其值为“ production-worker”。.ebextensions
变量名称是否匹配“ worker”,在APP_ENVIRONMENT
中创建配置文件以启动/停止sidekiq(以及worker所需的任何其他程序。)>cron.yaml
文件(请参见AWS docs)。cron.yaml
文件中列出的端点创建了单独的cron控制器。对于Sidekiq,您的Web应用程序和您的工作人员都需要被授予对Redis服务器的访问权限,因此您的应用程序可以创建作业,然后该工作人员可以将其提取以进行处理。