具有许多MondoDB数据库方法的NodeJS分片架构

时间:2019-05-24 13:43:00

标签: node.js mongodb express

我们的项目存在架构问题。一旦我们需要部分服务几乎无限的可伸缩性,该项目就需要分片。 目前,我们使用Node.js + MongoDb(猫鼬)和MySQL(TypeORM)。数据通过简单的“数据库定位器”由数据库分开。因此,节点进程需要连接到许多数据库(最多1000个)。

请求示例:

  • 来自具有商店ID的客户端的HTTP请求;
  • 通过商店ID获取“数据库定位器”服务中的数据库IP地址/凭据;
  • 使用商店数据创建到特定数据库的连接;
  • 执行数据库查询。

我们尝试了两种实现方式:

  1. 为每个请求创建连接,在响应时将其关闭。 问题:
    • 我们不能在响应后使用连接(这是主要问题,因为有时我们需要一些异步操作);
    • 工作速度较慢;
  2. 保持所有连接打开。 问题:
    • 达到同时连接限制或其他限制;
    • 内存泄漏。

哪种方法更好?如何避免描述的问题?也许有更好的解决方案? 解决方案#1在php上非常适合我们,因为它可以按要求运行单个进程,并可以在进程结束时轻松删除连接。众所周知,Express是运行在v8中的纯JS代码,不是基于进程的。 自动关闭不使用的连接非常好,但是找不到用于执行此操作的选项。

1 个答案:

答案 0 :(得分:1)

简短答案:停止将MongoDB与Mongoose一起使用

更长的答案:

MongoDB是面向文档的DBMS。基本用法是当您需要存储一些不太漂亮的结构化数据时,而又不需要使用太多。 RDBMS具有懒惰的索引编制,动态类型输入和许多其他不允许您使用的功能,但是它非常适合存储日志或任何序列化的数据。

这里最有价值的部分是猫鼬。这是一个使您感觉像垃圾箱是一个美好的世界的库,其中包含关系,虚拟字段以及许多不应该包含在DODBMS中的东西。另外,以前版本中有很多旧代码,这也给连接管理带来了麻烦。

您已经使用TypeORM,但可以使用Mongoose,但有一些限制。 它的工作方式与MySQL连接管理完全相同。

还有更多数据:https://github.com/typeorm/typeorm/blob/master/docs/mongodb.md#defining-entities-and-columns

在这种情况下,您可以将TypeORM存储库用作透明客户端,它将初始化连接并关闭连接或根据需要保持活动状态。