我想实时更新Node中MongoDB数据库的变化.js.

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

这就是我建立变革流的方式:

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

我try 了另一种方法来设置一条流,但速度同样慢:

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

在收集性能数据的同时,一个自动化的过程将微小的文档插入到集合中.

其他一些细节:

  • 开放流游标计数:50
  • 写入速度:insertMany个文档/秒(10批使用insertMany)
  • 运行时间:100秒
  • 平均延迟:7.1秒
  • 最大延迟:205秒(not a typo, over three minutes)
  • MongoDB版本:3.6.2
  • 集群设置#1:MongoDB Atlas M10(3个副本集)
  • 集群设置#2:DigitalOcean Ubuntu box+Docker中的单实例mongo集群
  • node .js CPU使用率:<1%

两种设置产生相同的问题.这到底是怎么回事?

推荐答案

node 中的default connection pool size.MongoDB的js客户端是5.从each change stream cursor opens a new connection开始,连接池至少需要和游标的数量一样大.

在版本3中. node Mongo驱动程序的x使用"poolSize":

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

version 4.x个 node Mongo驱动程序中,使用"minPoolSize"和"maxPoolSize":

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

(感谢MongoDB Inc.对this issue的调查.)

Mongodb相关问答推荐

如何将空值单独分组?

在提供的文档(_Id)之后和之前,是否有一个Mongo操作来获取已排序(和/或过滤)集合中的文档计数?

Mongo Aggregate管道-另一个集合中的多个查找

在数组对象 Mongodb 中仅 Select 需要的数组

MongoDB - 将数组元素转换为新字段

使用 multer 在我的 MERN 前端显示 MongoDB 图像的正确语法是什么?

如何对 MongoDB setWindowFields 中当前文档以外的文档进行操作

mongodb:多键索引 struct ?

当属性确实存在时,为什么mongoose模型的 hasOwnProperty 返回 false?

如何在 Mongoose 中定义一个通用的嵌套对象

Node.js 数据库的抽象层

从 MongoDB find() 结果集中识别最后一个文档

Java MongoDB/BSON 类混淆

Node.js 和 MongoDB,重用 DB 对象

.NET 中的 Mongodb 单元测试

具有简单密码认证的 MongoDB 副本集

当前的 URL 字符串解析器已弃用

指定在 mongodb .js 脚本中使用哪个数据库

show dbs 给出Not Authorized to execute command错误

mongoose — 判断 ObjectId 是否存在于数组中