AWS Beanstalk - 在工作人员和网络服务器之间共享数据库层

AWS Beanstalk - Share Database layer between worker and webserver

我正在使用 NodeJS 构建一些 Web 应用程序。 我将应用程序部署到 AWS beanstalk 网络服务器,并解耦了一些繁重的任务, 并将繁重的任务部署到不同的 AWS beantalk workers, 主 Web 服务器正在使用 SQS(aws 队列)执行工作程序。

主网络服务器有一个很大的数据库层来连接、获取和保存到数据库。 工作人员确实需要一些数据库操作,每种工作人员类型都需要不同的操作,这些操作已经在主 Web 服务器的数据库层中实现。

所以我正在尝试找到一种方法来使用 Web 服务器的数据库层,而无需在每个工作人员类型中重复它(这就是我现在正在做的)。

我的想法是将 DB 层与主应用程序分离,并将其部署到自己的 Web 服务器上,但这看起来很浪费,因为我不需要全部监听 DB 层中的请求时间,我需要一些按需操作。

我附上了它的外观图片:

有什么好的解决办法吗?

只需将本机 RDS 与您的 Beanstalk 环境集成即可:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.db.html

您从工人那里进行了多少 save/load 操作?同时运行有多少工人?我认为如果不了解那里有多少工作人员以及要保存多少数据,就很难提出单一解决方案。

总的来说,我其实可以想到多种解决方案:

  1. 你可以在web服务器上打开API,所以一旦worker完成,它就会调用web服务器。如果你有很多工人,它就不会工作,所以你可能需要一个介于两者之间的工人(我们称之为 "save worker"),所以当前工人将排队 "save job",然后 "save worker"将调用 Web 服务器 API,这将保证 Web 服务器不会因保存操作而超载。

  2. 您可以创建一个 Web 服务器的副本实例(我们称之为 "worker web server"),用于保存工作人员的结果,以便工作人员将结果推送到新的 SQS,此时 "worker web server" 将监听 SQS 中的保存请求。例如,您可以通过设置环境变量来控制网络服务器的工作模式。

  3. 您也许可以将 DB 层提取到 Web 服务器和 worker 中使用的包或库中,但是您需要注意不要在其中打开很多连接与数据库并行或同时执行大量数据库操作。