【发布时间】:2018-07-02 20:58:03
【问题描述】:
我想获得有关 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:DigitalOcean Ubuntu box + Docker 中的单实例 mongo 集群
- Node.js CPU 使用率:
两种设置都会产生相同的问题。这里会发生什么?
【问题讨论】:
-
您是否检查过您是否拥有所有需要的索引? IE。 “fullDocument.room”我想这需要一个索引
-
不,我没有任何索引。我真的不明白索引如何帮助整理新插入的项目。但我会试一试。
-
更新:在
room上添加了一个索引,没有任何改变。 -
你有没有找到任何提示?
-
不幸的是,没有。 :( 我要开始赏金了。
标签: mongodb