如何有效地关闭 MongoDB changeStream?

Posted

技术标签:

【中文标题】如何有效地关闭 MongoDB changeStream?【英文标题】:How to effectivelly close a MongoDB changeStream? 【发布时间】:2019-05-12 18:31:28 【问题描述】:

我一直在使用带有 Node.js 和 socket.io 的 MongoDB changeStreams;

我正在使用一种 pub-sub 架构,对于每个订阅,他应该用新订阅替换以前的 changeStream。

逻辑是这样的:

    客户端请求新订阅(它与一个集合有关 变化流) 如果客户端有changeStream,服务端会关闭这个changeStream,用更新的changeStream代替。

订阅的伪代码

// If it has a changeStream
if (socket.dbWatcher["users"]) 
  // close changeStream
  socket.dbWatcher["users"].removeAllListeners("change");
  socket.dbWatcher["users"].close();


// Replace with new changeStream and pipeline
socket.dbWatcher["users"] = db.collection("users").watch(pipeline, resumeAfter)
.on("change", (change) => 
  socket.emit("users", change)
)

事情变得越来越慢,所以我检查了连接数量,发现它远远超过了收集数量(16 个收集对 29 个连接)。

一旦套接字断开连接,我将关闭所有 changeStreams 但连接仍然存在(数据库)。我增加了poolSize,但是有29个连接是不正常的。

这是我用来检查连接的 mongodb 命令:db.serverStatus().connections

【问题讨论】:

MongoDB 部署的拓扑是什么?请记住db.serverStatus().connections 的值包括所有传入连接,包括任何mongo shell 连接和/或来自其他服务器的连接,即副本集或mongos 实例。 我使用默认配置的副本集。只需执行命令mongod --maxConns 64000 --replSet rs0 【参考方案1】:

您可以在此处查看关闭变更流的文档:https://docs.mongodb.com/manual/changeStreams/#resume-a-change-stream

正如您在node driver API 中看到的那样,更改流上有一个close() 方法。

但是,我不太确定快速关闭/重新打开与 MongoDB 更改流的连接是否有效。最好只关注整个用户集合。

所设计的 changestream 功能并非真正适用于传统的 pubsub 模式。有关详细信息,请参阅此问题:Severe performance drop with MongoDB Change Streams

【讨论】:

以上是关于如何有效地关闭 MongoDB changeStream?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用 stl 容器有效地存储对象? (即根据字段值进行搜索)[关闭]

如果我有 X 的素数分解,如何有效地获得 X 的所有除数? [关闭]

有效地管理多个相同的数据库? [关闭]

使用 python 快速有效地更新数百万个 MongoDB 文档的技巧?

mongodb - 按顺序计算缺失索引的最有效方法

如何优雅地关闭猫鼬的连接池?