gpt4 book ai didi

mongodb - MongoDB Change Streams 导致性能严重下降

转载 作者:IT老高 更新时间:2023-10-28 13:04:44 27 4
gpt4 key购买 nike

我想获得有关 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 使用率:<1%

两种设置都会产生相同的问题。这里会发生什么?

最佳答案

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

在 Node Mongo 驱动程序的 3.x 版中,使用“poolSize”:

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

version 4.x Node Mongo Driver 使用 'minPoolSize' 和 'maxPoolSize':

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

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

关于mongodb - MongoDB Change Streams 导致性能严重下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48411897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com