我一直在使用 MongoDB changeStreams使用 Node.js 和 socket.io;
我正在使用一种发布-订阅架构,对于每个订阅,他应该用新的订阅替换以前的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 个集合 vs 29 个连接)。
一旦套接字断开连接,我将关闭所有更改流,但连接仍然存在(数据库)。我增加了 poolSize,但是有 29 个连接是不正常的。
这是我用来检查连接的 mongodb 命令:db.serverStatus().connections
最佳答案
您可以在此处查看有关关闭变更流的文档:https://docs.mongodb.com/manual/changeStreams/#resume-a-change-stream
正如您在 node driver API 中看到的那样,变更流上有一个 close()
方法。
但是,我不太确定快速关闭/重新打开与 MongoDB 变更流的连接是否有效。只观察整个用户集合可能会更好。
设计的变更流功能并不是真正针对传统的发布订阅模式。有关更多详细信息,请参阅此问题:Severe performance drop with MongoDB Change Streams
关于node.js - 如何有效关闭MongoDB的changeStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53729702/