我正在研究一种使用node.js + mongoose和mongodb实现多租户支持的多数据库的好方法。Mongoose为node.js中的多租户支持创建连接
我发现猫鼬支持一种名为createConnection()
的方法,我想知道使用该方法的最佳实践。实际上,我将所有这些连接存储在一个由租户分隔的数组中。它会像:
var connections = [
{ tenant: 'TenantA', connection: mongoose.createConnection('tenant-a') },
{ tenant: 'TenantB', connection: mongoose.createConnection('tenant-b') }
];
比方说,用户发送他将请求头中记录的租户,我得到它在表达一个非常早期的中间件。
app.use(function (req, res, next) {
req.mongoConnection = connections.find({tenant: req.get('tenant')});
});
问题是,可以静态存储这些连接还是更好的移动会在每次发出请求时创建该连接?
编辑2014年9月9日 - 在软件需求
起初,我们将有大约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”,单独的“集合”还是......?即连接有何不同? – 2014-09-05 16:45:57
嘿,thx回复。身份验证发生在应用程序级别,但它会检查mongo集合(用户)。这个想法是为每个租户都分配一个分贝(在网络上进行了一些研究后,人们说避免前缀收集,但他们没有说明为什么......)。我们还不知道租户会如何区别对待,也许还有将来的一段时间,但我希望能为不同索引做好准备。 – 2014-09-06 18:28:15