MongoDB Change Streams性能严重下降

时间:2018-01-23 22:30:12

标签: mongodb

我希望获得有关Node.js中MongoDB数据库更改的实时更新。

单个MongoDB更改流几乎立即发送更新通知。但是当我打开多个(10+)流时,数据库写入和通知到达之间会有大量延迟(最多几分钟)。

我是如何设置更改流的:

let cursor = collection.watch([
  {$match: {"fullDocument.room": roomId}},
]);
cursor.stream().on("data", doc => {...});

我尝试了另一种设置流的方法,但它同样慢:

let cursor = collection.aggregate([
  {$changeStream: {}},
  {$match: {"fullDocument.room": roomId}},
]);
cursor.forEach(doc => {...});

自动化流程在收集性能数据时将微小文档插入到集合中。

其他一些细节:

  • 开放流游标数:50
  • 写入速度:100个文档/秒(使用insertMany的10个批次)
  • 运行时间:100秒
  • 平均延迟:7.1秒
  • 最大延迟:205秒(不是拼写错误,超过三分钟)
  • MongoDB版本:3.6.2
  • 群集设置#1:MongoDB Atlas M10(3副本集)
  • 群集设置#2:Docker中的DigitalOcean Ubuntu框+单实例mongo群集
  • Node.js CPU使用率:< 1%

两种设置都会产生同样的问题。可能会发生什么?

1 个答案:

答案 0 :(得分:25)

MongoDB的Node.js客户端中的default connection pool size为5.由于每个更改流游标都会打开一个新连接,因此连接池必须至少与数量一样大游标。

const mongoConnection = await MongoClient.connect(URL, {poolSize: 100});

(感谢MongoDB Inc.调查this issue。)