Mongoose 在 Node.js 中创建多租户支持连接

2024-01-10

我正在研究一种使用 node.js + mongoose 和 mongodb 实现多数据库以支持多租户的好方法。

我发现 mongoose 支持一种名为createConnection()我想知道使用它的最佳实践。实际上,我将所有这些连接存储在一个数组中,由租户分隔。它会是这样的:

var connections = [
   { tenant: 'TenantA', connection: mongoose.createConnection('tenant-a') },
   { tenant: 'TenantB', connection: mongoose.createConnection('tenant-b') }
];

假设用户向租户发送他将通过请求标头登录的信息,我在 Express 的一个非常早期的中间件中得到了它。

app.use(function (req, res, next) {
    req.mongoConnection = connections.find({tenant: req.get('tenant')});
});

问题是,是否可以静态存储这些连接,或者更好的做法是在每次发出请求时创建该连接?

编辑 2014-09-09 - 有关软件要求的更多信息

起初我们将有大约 3 个租户,但我们的计划是在一两年内将这个数字增加到 40 个。读操作比写操作多,它基本上是一个带有机器学习的大数据系统。它不是免费增值软件。由于历史数据量很大,数据库相当大,但将非常旧的数据移动到另一个位置不是问题(我们已经考虑过这一点)。我们计划稍后将其分片,如果我们的数据库计算机上的可用资源耗尽,我们还可以将一些租户分离到不同的计算机上。

最让我感兴趣的是,有些人说为多租户提供前缀集合不是一个好主意,但其原因很短。

https://docs.compose.io/use-cases/multi-tenant.html https://docs.compose.io/use-cases/multi-tenant.html

http://themongodba.wordpress.com/2014/04/20/building-fast-scalable-multi-tenant-apps-with-mongodb/ http://themongodba.wordpress.com/2014/04/20/building-fast-scalable-multi-tenant-apps-with-mongodb/


我不建议手动创建和管理这些单独的连接。我不知道您的多租户要求的详细信息(租户数量、数据库大小、预期交易数量等),但我认为最好选择类似的东西Mongoose的useDb函数 https://github.com/LearnBoost/mongoose/wiki/3.8-Release-Notes#connection-pool-sharing。然后 Mongoose 可以处理所有连接池细节。

update

我要探索的第一个方向是在单独的节点进程上设置每个租户。在单独的节点进程中运行租户有一些有趣的好处。从安全角度(隔离内存)和稳定性角度(一个租户进程崩溃不会影响其他进程)来看,这是有意义的。

假设您基于 URL 进行租赁,您将在实际租户服务器之前设置一个代理服务器。它的工作是查看 URL 并根据该信息路由到正确的进程。这是一个非常简单的节点http代理 https://github.com/nodejitsu/node-http-proxy设置。每个租户实例可以是完全相同的代码库,但使用不同的配置启动(告诉他们要使用什么 mongo 连接字符串)。

这意味着您可以像非多租户一样设计实际应用程序。每个进程只知道一个mongo数据库,不需要多租户逻辑。它还使您能够稍后根据负载轻松分割流量。如果出于性能原因需要拆分租户,您可以在代理级别透明地进行。 DNS 可以全部保持不变,您只需将实例所在的服务器移到后台即可。您甚至可以让代理平衡多个服务器之间对租户的请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mongoose 在 Node.js 中创建多租户支持连接 的相关文章

  • 早于 0.4.12 的 Node.js 无法在 AWS EC2 上正常工作。为什么?

    我无法在 AWS EC2 Ubuntu 或 CentOs 没关系 上安装 node js v0 6 1 安装后我输入node 处理器负载达到100 但 v0 4 12 工作正常 可能只有我有这个问题 那不好意思了 请告诉我我做错了什么 提前
  • 使用nodejs的sequelize更新多对多连接表

    我有一个产品表和一个类别表 一个产品可以有多个类别 一个类别可以有多个产品 因此我有一个 ProductsCategories 表来处理多对多连接 在下面的示例中 我尝试将我的一款产品 ID 为 1 与 3 个不同的类别 ID 为 1 2
  • MongoDB 查询数组以获取精确的元素匹配,但可能是无序的

    我在 MongoDB 中有一个文档 如下所示 users 2 3 4 我尝试通过匹配用户数组来查询该文档 db things find users all 2 3 4 该查询有效 但也会返回此文档 users 2 3 4 5 最后一个要求是
  • 节点未找到全局模块

    所以我意识到这是一个相当通用的标题和问题 但我已经搜索了很多答案 但遗憾的是它们似乎都不适合我 我希望通过我自己提供更多信息 也许有人有一个具体的答案 或者确切地知道将我重定向到哪个答案 我的问题 当我全局安装节点模块时 例如npm ins
  • Socket.io、集群、快速和同步事件

    1周以来我遇到了一个大问题 我尝试将实际在单核上运行的 node JS 项目转换为具有集群的多核 对于 websockets 目前 我对事件没有任何问题 但是 对于 xhr polling 或 jsonp polling 我在集群模式下使用
  • Javascript 从 Buffer 到 JSON

    我正在使用 bleno 一个 Node js BLE 包 它使用 Buffer 来发送和接收数据 我将如何获取 Buffer 对象并将其转换为 JSON 这就是我现在所拥有的 bufferToJson buffer toString buf
  • 如何将sinon间谍模块导出实用函数

    在 javascript ES6 中 我有一个实用程序模块 其中只包含一些函数 然后在文件末尾 我像这样导出它们 module exports someFunction1 someFunction2 someFunction3 然后我想为这
  • 节点的heroku:! Heroku 推送被拒绝,未检测到 Cedar 支持的应用程序

    我是 heroku 和express js 的新手 我尝试完成本教程 但无法通过 git push heroku master 步骤完成 我完全按照教程进行操作 以下是错误消息 Counting objects 269 done Delta
  • 使用 Javascript 展平父子 JSON 数组

    我有一个如下所示的数组 const arr name x type type1 parent name a type type1 name y type type1 parent name b type type1 我想将其展平并最终得到如
  • mongodb在单个操作中进行多个聚合

    我有一个包含以下文档的项目集合 item i1 category c1 brand b1 item i2 category c2 brand b1 item i3 category c1 brand b2 item i4 category
  • Node.js Google-云存储上传目的地规范

    我有一个 Node js 服务器并且正在使用谷歌云上传一些图像文件的包Firebase 存储 上传本身工作正常 但 google cloud API 似乎只能将文件上传到 Firebase Storage 根文件夹 有没有办法指定远程位置来
  • Nodejs 在路由器页面中包含 socket.io

    我有一个 Express Node 应用程序 并且我试图通过不在 app js 中包含所有 socket io 内容来保持代码整洁 我不知道解决这个问题的最佳方法 这是我最初的想法 感觉不是最干净的 app js var express r
  • axios 在发送数据时给我将循环结构转换为 json 错误

    我的代码如下所示 axios post https api sandbox xyz com v1 order new JSON stringify request v1 order new nonce 123462 client order
  • Apollo 服务器:将参数传递给嵌套解析器

    我的 GraphQL 查询如下所示 p1 property someArgs some value id nestedField id moreNestedField id 在服务器端 我使用 Apollo Server 我有一个解析器pr
  • 用于高效大规模图遍历的数据库

    我有一个大型二分有向图数据集 约 2000 万个元素 在当前的使用中 我运行的遍历算法每次运行约 500 000 个节点 这些算法有效 但历史上运行的是从文本文件加载到内存的数据 文本文件似乎是一个不好的方法 所以我将数据作为邻接列表传输到
  • 何时对 MongoDB 集合调用 EnsureIndex?

    我什么时候应该打电话ensureIndex 插入单条记录之前 插入单条记录之后 或者调用之前find 看来我的评论有点被误解了 所以我会澄清一下 当你调用它时并不重要只要在第一次调用 find 之前的某个时刻调用它即可 换句话说 什么时候创
  • 如何使用 jest 测试 unhandledRejection / uncaughtException 处理程序

    我有处理程序unhandledRejections and uncaughtExceptions bin js unhandledRejection uncaughtException forEach event gt process on
  • Mongoose:保存时根据父字段值设置子文档字段值

    这几乎肯定在其他地方有所涉及 但是 如果我有一个带有嵌入子文档的单一架构 如下所示 var ChildSchema new Schema name type String trim true user type String trim tr
  • 在 Node.js 中封装 require 可以解决相对路径调用

    我正在尝试创建一个 require 包装器来加载依赖项 但我发现很难让它像原始的 require 函数一样工作 当路径是相对路径时 包装器无法解析为正确的路径 因为我的加载程序和调用程序文件不在同一文件夹中 这是一个简化的描述 index
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以

随机推荐

  • OSError: [WinError 10038] 尝试对非套接字的操作

    我正在这里测试客户端方案 服务器和客户端使用相同的端口9009进行连接 不知怎的 下面的代码给了我 OSError 如标题中所写 import sys import socket import select def chat client
  • Firebase JavaScript SDK - 检索用户 IP 地址

    假设我的浏览器脚本自动匿名登录任何用户 是否可以收集用户的公共 IP 地址 我找到了firebase auth currentUser metadata财产 但它只包括LastSignInTime and creationTime 用户公共
  • 如何在 codemirror 编辑器中使用 cypress .type() 进行输入?

    我正在写一些cypress测试 Codemirror 编辑器 我有用cypress在输入字段中键入 我正在努力实现cy type 在 CodeMirror 编辑器中 我在 codemirror 中的数据位于范围内 pre class Cod
  • Kivy Spinner:从 Spinner 中选择一个值时触发的任何事件

    我介绍一个Spinner在我的小部件中 每次我从中选择不同的值时 我都想执行一些操作 是否可以 我似乎只收到事件on press and on release 但是当选择不同的值时它们不会被触发 此致 Bojan 因为每次 attr val
  • 如何区分我自己的类和 gem 的类

    我有一个 Rails 项目 我已经研究了一段时间了 像许多 Rails 项目一样 我有一个 User 类 在我的一个控制器中 我需要从我正在使用的 gem 访问一些方法 gem 中的示例代码演示了如何使用包含到特定 gem 模块 我不会在这
  • PGAdmin - 为什么数据库限制(和高级属性)被禁用?

    我希望限制在浏览器树 层次结构中看到的数据库数量 因为它是一个拥有数百个数据库的 AWS 服务器 基于这个答案 https stackoverflow com questions 12663639 how to hide databases
  • 春季时间表 - 每月最后一天不工作

    我想在 每月最后一天 10 15 和 每月第一个星期日 运行春季调度程序作业 我在下面尝试过 但在初始化 spring 上下文时出现错误 org springframework boot SpringApplication 应用程序启动失败
  • Excel:SUMPRODUCT 计算共享工作负载(以小时为单位)和百分比

    我要再问一个问题 Excel 带百分比的 SUMPRODUCT https stackoverflow com questions 71080332 excel sumproduct with percentages 没有以另一种方式解决
  • 如何修复curl 56 GnuTLS接收错误(-110):TLS连接未正确终止[重复]

    这个问题在这里已经有答案了 同样的问题 git 错误 RPC 失败 curl 56 GnuTLS 接收错误 110 https stackoverflow com questions 50813406 and 错误 RPC 失败 curl
  • Github 页面上的 Angular 4 应用程序

    我有一个简单的Angular 4 我想要托管的应用程序Github Pages 执行此操作的选项来自Angular CLI似乎已删除 有没有办法做到这一点 如果有的话怎么办 这是我的 package json name e portfoli
  • Javascript 抓取 document.URL 的最后一部分? [复制]

    这个问题在这里已经有答案了 我试图获取当前网址的最后一部分 URL http example com test action http example com test action 我正在努力抓住 行动 URL 在该结构中始终保持一致 但
  • 将值从 HTML 传递到 CSS

    我感兴趣是否可以将值从 html 传递给 css 类 像这样 例子 div class Some text div style mt mpx margin top mpx px 我听说这种方式在 Less 中是可能的 不 你想要的方式在 C
  • ConnectivityManager 在获取网络信息时崩溃

    我是 Android 新手 当我给出以下代码片段时 我的 Android 应用程序崩溃了 ConnectivityManager manager ConnectivityManager this getSystemService Conte
  • 如何在 Nexmo 中向美国号码发送文本

    向菲律宾发送信息非常简单 但在美国的数字中 我必须进行验证 但我不知道如何进行 我开始了2F认证 但似乎我不知道下一步该怎么做 我的问题 如何在 Nexmo 中添加发送文本到美国号码 对于美国 您必须从您的 nexmo 帐户创建一个短代码
  • 来自本地 json 变量的 d3 饼图

    我正在尝试使用我见过的局部变量 而不是外部文件 中的 json 创建一个圆环图这个帖子 https stackoverflow com questions 10934853 d3 js loading json without a http
  • 由于格式不正确,加载程序集失败

    我开发了一个相当大的 Windows Forms net C 应用程序 其中包含多个程序集 最初 每个程序集都是为目标平台 任何 CPU 构建的 由于 x64 机器上的 Crystal Reports 存在问题 我们必须为 x86 目标平台
  • 如何在react-quill中注册对齐样式

    我在用着反应鹅毛笔 https www npmjs com package react quillnpm 包并在 nextjs 中动态导入它 我还使用 create next app 样板 我能够让反应鹅毛笔编辑器工作 但是 我无法获取使用
  • 地理编码器 Gem 无法在生产环境中工作

    所以我正在使用Geocoder https github com alexreisner geocoder根据用户提交表单时提供的地址提取纬度和经度坐标 我这样做是为了使用 Google 地图 API 绘制标记 这在开发中非常有效 零问题
  • .NET 4.5 中是否已弃用 ObjectContext?

    我一直在使用ObjectContexts已经很长一段时间了 现在我已经安装了 VS 2012 令我惊讶的是 实体数据模型没有创建代码生成项的选项ObjectContexts and EntityObjects代替DbContexts and
  • Mongoose 在 Node.js 中创建多租户支持连接

    我正在研究一种使用 node js mongoose 和 mongodb 实现多数据库以支持多租户的好方法 我发现 mongoose 支持一种名为createConnection 我想知道使用它的最佳实践 实际上 我将所有这些连接存储在一个