如何有效关闭MongoDB changeStream?

时间:2018-12-11 17:50:38

标签: node.js mongodb socket.io

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

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

逻辑如下:

  1. 客户端请求新的订阅(与集合相关 changeStream)
  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个集合对29个连接)。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

但是,我不确定与MongoDB changestreams快速关闭/重新打开连接是否会有效。最好观察整个用户集合。

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