10

背景:我正在尝试优化我的 Node.js API 的速度,该 API 在 Amazon Cloud 上使用 Express 和 Mongoose 构建。我有一个 API 调用需要很长时间才能运行(我的 /stats API 调用会编译来自大量来源的数据,因此会进行数百个 mongo 查询,因此运行大约需要 20 秒)。我注意到,当这个 API 调用正在运行时,其他也命中 Mongo 副本集的 API 调用返回缓慢。我的第一个想法是统计查询很慢,因此阻塞,但根据我的统计面板,我没有任何查询需要超过 100 毫秒才能运行,而且我的 Mongo DB 统计数据都在相当健康的范围内(每个查询 20 多个)第二,<1% btree 未命中,<5% 锁定)。

问题:现在,我的 Node.js 应用程序在启动时建立到 Mongo 集的单个连接,并且所有查询都使用该连接。建立多个连接会更好吗?例如,我应该为每个入站 API 请求建立一个新的 Mongo 连接吗?或者,也许我应该有一个到副本集的静态连接数,并在执行查询时在这些连接之间进行负载平衡?

或者也许我完全不在基地?

4

1 回答 1

15

您绝对应该使用多个连接,否则一次只能执行一个查询。最简洁的方法是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) { ... }

您在统计数据中没有看到缓慢的查询时间的原因是您的并发查询只是在客户端排队等待连接可用。该等待时间不会显示在服务器端查询时间中。

于 2012-10-08T20:53:26.260 回答