node.js - 如何有效关闭MongoDB的changeStream?

标签 node.js mongodb socket.io

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

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

逻辑是这样的:

  1. 客户端请求新订阅(与集合相关) 更改流)
  2. 如果客户端有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/

相关文章:

javascript - 带有 Node 集群模块的 Socket.io

node.js - 根据 url 为特定组设置 socket.io 房间。 Node.js、Express、Angluarjs

javascript - 修改值 - 通过引用传递

node.js - Passport 事件目录 node.js

mongodb - 如何使用 Monger 更新/插入 MongoDB 子文档?

mongodb - 根据时间戳从 MongoDB 集合中获取文档

node.js - 如何在 socket.io 中基于 2 个用户创建一个房间?

android - 聊天应用程序用户如何才能再次在线获得离线时发送给他们的消息

javascript - 找不到全局定义的变量

php - jenssegers/laravel-mongodb 正则表达式在不工作的地方