背景:我正在尝试优化我在Amazon Cloud上使用Express和Mongoose构建的Node.js API的速度。我有一个API调用,需要花费大量的时间来运行(我的/ stats API调用编译来自许多源的数据,因此产生了数百个mongo查询,因此运行大约需要20秒)。我注意到,当这个API调用正在运行时,其他也调用了Mongo副本集的API调用返回的速度很慢。我的第一个想法是统计数据查询很慢,因此阻塞,但根据我的统计小组,我没有任何查询> 100毫秒运行,我的Mongo数据库统计数据都在相当健康的范围内(每秒20多个查询,< 1%btree miss,< 5%锁定)。
问题:现在,我的Node.js应用程序在启动时建立了与Mongo集的单个连接,并且所有查询都使用该连接。建立多个连接会更好吗?例如,我应该为每个入站API请求建立一个新的Mongo连接吗?或者,也许我应该有一个静态的连接到副本集,并在执行查询时在这些连接之间进行负载平衡?
或许我完全离开了基地?
答案 0 :(得分:12)
您绝对应该使用多个连接,否则一次只能执行一个查询。最简单的方法是在创建mongodb.Server
对象时在Db
对象上启用连接池。例如:
var serverOptions = {
'auto_reconnect': true,
'poolSize': 5
};
var mdb = new mongodb.Db('test', new mongodb.Server('127.0.0.1', 27017, serverOptions));
mdb.open(function (err, mdb) { ... }
您在统计信息中没有看到查询时间慢的原因是您的并发查询只是在客户端排队等待连接变为可用。等待时间不会出现在服务器端查询时间内。