Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用mongoose和Node.js的多租户。一个或多个连接?_Javascript_Node.js_Mongodb_Typescript_Mongoose - Fatal编程技术网

Javascript 使用mongoose和Node.js的多租户。一个或多个连接?

Javascript 使用mongoose和Node.js的多租户。一个或多个连接?,javascript,node.js,mongodb,typescript,mongoose,Javascript,Node.js,Mongodb,Typescript,Mongoose,我们正在构建一个Saas应用程序,出于技术原因(备份、安全),我们需要采用多租户体系结构(即每个客户一个DB)。我们正在使用Node.js(带有Typescript)和MongoDB(带有mongoose驱动程序) 对于第一个测试,我们做如下操作。请注意,这是一份容易复制的简单草稿 我们在index.ts中启动一个新连接,即“入口点”: 试试看{ //定义Mongo连接选项 常量mongoopions={ useNewUrlParser:true, useCreateIndex:true, us

我们正在构建一个Saas应用程序,出于技术原因(备份、安全),我们需要采用多租户体系结构(即每个客户一个DB)。我们正在使用Node.js(带有Typescript)和MongoDB(带有mongoose驱动程序)

对于第一个测试,我们做如下操作。请注意,这是一份容易复制的简单草稿

我们在
index.ts
中启动一个新连接,即“入口点”:

试试看{
//定义Mongo连接选项
常量mongoopions={
useNewUrlParser:true,
useCreateIndex:true,
useUnifiedTopology:正确,
UseFindModify:false,
自动索引:正确,
游泳池规模:10,
bufferMaxEntries:0,
连接超时:10000,
socketTimeoutMS:30000,
};
//创建mongo连接
const connection=wait mongoose.connect(
`mongodb://${process.env.MONGO_主机名}:${process.env.MONGO_端口}`,
Mongoopions
);
//连接数据库;
log('成功连接到mongo数据库!');
}捕捉(错误){
控制台日志(err);
}
然后在一个单独的文件中,我们有一些逻辑来选择适当的数据库并返回模型:

从“猫鼬”导入猫鼬;
导出类ClientDbProvider{
静态异步getTenantDb(
租户:字符串,
modelName:string,
schema:mongoose.schema
) {
const dbName=`spearateDB_${tenantId}`;
const db=mongoose.connection.useDb(dbName,{useCache:true});
db.model(modelName,schema);
返回分贝;
}
静态异步getModelForDb(数据库名:string,
模型:mongoose.model,模式:mongoose.schema
) {
const connection=wait ClientDbProvider.getTenantDb(
数据库名,
model.modelName,
模式
);
返回connection.model(model.modelName);
}
}
然后,在任何路由中,我们都包括
clientID
,以使用适当的数据库

router.post('/api/data/:clientID',异步(请求:请求,响应:响应)=>{
常量{name,value}=req.body;
const data=data.build({
姓名:姓名,,
价值:价值,
});
试一试{
const dataModel=await ClientDbProvider.getModelForDb(
req.params.clientID,
数据,
数据模式
);
const doc=wait dataModel.create(数据);
}捕捉(错误){
控制台日志(err);
}
res.send({});
});
基本上,我们调用
ClientDbProvider.getModelForDb
来获取模型。
getModelForDb
使用相同的连接池切换到不同的数据库并返回模型

应用程序上的注意事项:

  • 数据库将不断被数据填充,因为它将存储来自多个传感器的遥测数据(有些传感器可以每秒生成数据,有些传感器每10分钟生成一次数据…)
  • api主要用于读取数据(以JSON的形式发送)
  • 有些查询可能很长,但它取决于客户机询问的许多数据(即使我们会设置一些默认限制)
  • 我们永远不会有大量的客户(DB)。我们计划在未来两年拥有20到40个客户(如果需要,我们将升级到另一种体系结构,如分片集群)。在任何情况下,客户的数量都不会超过100万左右
  • 所有数据库都在同一个服务器/mongo实例上(目前)
问题:

  • 此“草稿”代码是否会导致一些问题或性能问题
  • 使用
    mongoose.createConnection
    函数为每个DB(客户)创建一个连接,然后按照描述缓存该连接(例如,在全局变量中)是否有意义
  • 由于我们所有的数据库都在同一台服务器上,增加连接池是不够的吗