我正在研究使用node.js + mongoose和mongodb为多租户支持实现多个数据库的好方法。
我发现猫鼬支持一种称为的方法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/
我不建议手动创建和管理这些单独的连接。我不知道您的多租户需求的详细信息(租户数量,数据库大小,预期交易数量等),但是我认为最好使用Mongoose的useDb函数之类的东西。然后,Mongoose可以处理所有连接池详细信息。
我将探索的第一个方向是在单独的节点进程上设置每个租户。在单独的节点进程中运行租户有一些有趣的好处。从安全角度(隔离内存)和稳定性角度(一个租户进程崩溃不会影响其他进程),这是有意义的。
假设您基于URL建立租约,则可以在实际租户服务器之前设置代理服务器。工作是查看URL并根据该信息路由到正确的过程。这是一个非常简单的节点http代理设置。每个租户实例可以是完全相同的代码库,但是启动时使用不同的配置(该配置告诉他们要使用的mongo连接字符串)。
这意味着您可以将实际应用程序设计为非多租户。每个进程仅知道一个mongo数据库,并且不需要多租户逻辑。它还使您可以稍后根据负载轻松拆分流量。如果出于性能原因需要拆分租户,则可以在代理级别透明地进行。DNS都可以保持不变,您只需将实例所在的服务器移到幕后即可。您甚至可以使代理在多个服务器之间平衡对租户的请求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句