我如何安排我的 3 个 Nodejs 服务器与共享 MongoDB 模型一起工作

How can I orchestrate my 3 Nodejs servers to work together with shared MongoDB Models

标题可能有点误导,但我无法正确表达。我会尽量解释清楚,必要时甚至会画一些东西。我知道这是 web 开发/云开发/后端的一个大话题,我现在主要是在寻找我面临的这个问题的直接答案,以及一些 high-level 介绍,如果我到达,我可以期待什么规模。到时候我会开始更深入地阅读这些主题。

我的设置如下。 3 个使用 Nodejs+Express 和 Typescript 的后端服务器。两个用于服务两种类型的不同客户和一个管理服务器。我将它们命名为服务器 A、B 和管理员。我将 MongoDB 用于数据库,现在确定我将使用 Azure 还是 AWS 来托管这些数据库。

我的要求如下:

  1. 名为 Thing1、Thing2 的共享模型应由所有 3 个服务器访问。管理员主要与它们交互并创建它们,但 ServerA/B 需要访问它们才能将它们发送给客户。 Thing1 由 ServerA 访问,而 Thing2 由 A 和 B

  2. 我需要一种在服务器之间进行通信的方法,因为 ServerA 中发生的某些事情也应该更新 ServerB 中包含的模型。一种解决方案可能是将交互的这一部分拆分为一个全新的服务,并让它处理服务器之间的通信,可能有一个事件 queue 或套接字连接。或者我应该只从 ServerA 向 ServerB 发出 HTTP 请求?

问题:

  1. Typescript 要求所有 src 都在同一个根目录下,所以我不确定如何共享 MongoDB 模型。

  2. 我正在考虑使用套接字连接和第四台服务器作为交互中的桥梁,但我很困惑如果我有多个实例那么它在云中如何工作等等在。 (在这种情况下 HTTP 请求如何工作?可能是将流量引导到不同实例的负载均衡器)

所以流程是,

  1. 管理员创建了 Thing1 ->
  2. ServerA 与之交互(管理员应该以某种方式从 ServerA 访问模型并更新它以反映正在创建的新事物,例如将事物 ID 添加到模型中)->
  3. ServerA 模型得到更新(我们已经在 ServerA 中如此简单)并且来自 ServerB 的模型也应该得到更新,删除 Thing1 并创建 Thing2。这一步促使我使用第四个服务来处理这个问题,因为它必须与其他两个服务进行通信。 ServiceA/B 都需要访问 Thing2。

我很抱歉解释,但我也对如何处理这个问题感到困惑。我会进一步解释任何需要的东西。我当前的问题只是如何从这些不同的服务访问不同的 MongoDB collections 以及如何将更改/事件传播到所有服务。

我们可以将大问题分解为:

  1. 建筑
  2. 部署
  3. 工具

建筑

我建议你遵循 DDD 和 Mediator Pattern 这样的模式,最后一个对你的情况非常有效(things 之间的通信)check this page for an intro on Typescript, but it is better to read Eric Evans DDD DDD 的发明者

部署

如果您不确定在哪里托管您的应用程序,我建议您使用 Docker。有了它,您可以构建一个 image 可部署在 AWS 或 Azure 上。

Tools/Framework

我建议您阅读以下内容:

  • monorepo 喜欢 rush 拆分应用程序。
  • inversify DI
  • 免责声明:我是这个包的作者 MediatR-ts I have made a porting on Typescript of the famous MediatR