node.js - 如何编排我的 3 个 Nodejs 服务器以与共享的 MongoDB 模型一起工作
问题描述
标题可能有点误导,但我无法正确表达。我会尽量解释清楚,如有必要,我什至会画一些东西。我知道这是 Web 开发/云开发/后端的一个巨大主题,我现在主要是寻找我面临的这个问题的直接答案,以及一些关于如果我扩大规模可以期待的高级介绍。到时候我会开始更深入地阅读这些主题。
我的设置如下。3 个使用 Nodejs+Express 和 Typescript 的后端服务器。两个用于服务两种不同的客户和一个管理服务器。我将它们命名为服务器 A、B 和管理员。我使用 MongoDB 作为数据库,现在确定我是否会使用 Azure 或 AWS 来托管这些。
我的要求如下:
所有 3 个服务器都应访问名为 Thing1、Thing2 的共享模型。管理员主要与它们交互并创建它们,但服务器 A/B 需要访问它们才能将它们发送给客户。Thing1 由 ServerA 访问,而 Thing2 由 A 和 B 访问
我需要一种在服务器之间进行通信的方法,因为 ServerA 中发生的事情也应该更新 ServerB 中包含的模型。一种解决方案可能是将交互的这一部分拆分为一个全新的服务,并让它通过事件队列或套接字连接来处理服务器之间的通信。还是我应该只从 ServerA 向 ServerB 发出 HTTP 请求?
问题:
Typescript 要求所有的 src 都在同一个根目录下,所以我不知道如何共享 MongoDB 模型。
我正在考虑使用套接字连接,也许还有第四台服务器作为交互的桥梁,但如果我有多个实例等等,我对在云中如何工作感到困惑。(在这种情况下,HTTP 请求也是如何工作的?可能是一个将流量引导到不同实例的负载均衡器)
所以一个流程是,
- 管理员创建 Thing1 ->
- ServerA 与之交互(管理员应该以某种方式从 ServerA 访问模型并更新它以反映正在创建的新事物,例如将事物 ID 添加到模型中)->
- ServerA 模型得到更新(我们已经在 ServerA 中如此简单)并且来自 ServerB 的模型也应该得到更新,删除 Thing1 并创建 Thing2。这一步推动我使用第四个服务来处理这个问题,因为它必须与其他两个服务进行通信。ServiceA/B 都需要访问 Thing2。
我很抱歉的解释,但我也有点困惑如何处理这个问题。我会进一步解释需要什么。我当前的问题是如何从这些不同的服务访问不同的 MongoDB 集合,以及如何将更改/事件传播到所有服务。
解决方案
我们可以将大问题分解为:
- 建筑学
- 部署
- 工具
建筑学
我建议您遵循 DDD 和 Mediator Pattern 之类的模式,最后一个在您的情况下非常有效(事物之间的通信)检查此页面以获取有关 Typescript 的介绍,但最好阅读DDD的发明者Eric Evans DDD。
部署
如果您不确定在哪里托管您的应用程序,我建议您使用Docker。使用它,您可以构建可在 AWS 或 Azure 上部署的映像。
工具/框架
我建议您阅读以下内容:
- monorepo喜欢拆分应用程序。
- 为 DI反转
- 免责声明:我是这个包 MediatR-ts的作者,我在著名的MediatR的 Typescript 上进行了移植
推荐阅读
- qt - 为什么调用“onExited”事件处理程序而不是“onDropped”?
- python - 如何在不超出由另一列中的值设置的间隔范围的情况下随机调整列的每个数组中的值
- r - 在ggplot2中的两个指定框之间添加空格和一条线
- java - 不知道如何修复:错误:不兼容的类型:可能有损从 double 到 int 的转换
- c# - C#中是否有注解来迭代序列化创建的xml中的数组元素的名称?
- c# - 有什么方法可以检测对象是什么 ui 类型?
- node.js - 条纹“没有这样的价格”
- laravel - Laravel:key() 期望参数 1 是数组,给定整数
- markdown - 标准化 DITA:将主题拆分为单独的文件?
- shell - 使用 Ansible 将给定路径中的子目录和文件移动到父目录