【发布时间】:2014-10-22 11:44:01
【问题描述】:
我正在研究一种使用 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
http://themongodba.wordpress.com/2014/04/20/building-fast-scalable-multi-tenant-apps-with-mongodb/
【问题讨论】:
-
始终创建和销毁连接的成本很高 - 您是否在数据库中使用身份验证?还是仅在您的应用程序中?每个租户是在一个单独的实例中,“db”,单独的“collection”还是......?即连接有何不同?
-
嘿,谢谢回复。身份验证发生在应用程序级别,但它检查 mongo 集合(用户)。这个想法是为每个租户都有一个数据库(在网络上进行了一些研究之后,人们说要避免收集前缀,但他们没有说为什么......)。我们还不知道租户之间会有什么不同,也许在未来的某个时候,但我希望它像不同的索引一样为它做好准备。
标签: node.js mongodb mongoose multi-tenant