Node中不断轮询MongoDB的效率

Posted

技术标签:

【中文标题】Node中不断轮询MongoDB的效率【英文标题】:The efficiency of continuously polling MongoDB in Node 【发布时间】:2017-01-04 21:21:15 【问题描述】:

我需要根据数据库更改不断更新客户端上的数据。我正在考虑有一个 5 秒的间隔函数来重复收集所有数据库信息并使用 Socket.IO 将数据发送到客户端。

目前,我在没有 socket.io 的情况下在客户端本身上执行此操作,只是反复对服务器进行 REST 调用,然后由该服务器处理数据。

我的问题是:这些方法是高效还是低效?是否有更好的解决方案来解决我想要实现的目标?

【问题讨论】:

考虑 tailable cursor 和 sockiet.io,如果它适合您的应用程序。 【参考方案1】:

我需要更多细节来确定,但这听起来不是一个好的解决方案。

如果您需要的数据没有迅速变化,比如几秒钟内,您的每个连接仍然每 5 秒轮询一次,这有点浪费。

在这种情况下,您可能只是触发数据发生更改的事件,然后您可以通过活动的套接字推送消息。

【讨论】:

【参考方案2】:

Ryan,您可以尝试使用MongoDB's collection.watch(),它会在每次对集合进行更新时触发一个事件。您需要在套接字连接事件中执行此操作才能使其正常工作。大致如下:

io.sockets.on('connection', function(socket) 
  // when the socket is connected, start listening to MongoDB
  const MongoClient = require("mongodb").MongoClient;
  MongoClient.connect("mongodb://192.168.1.201")
    .then(client => 
      console.log("Connected correctly to server");
      // specify db and collections
      const db = client.db("your_db");
      const collection = db.collection("your_collection");
      const changeStream = collection.watch();
      // start listening to changes
      changeStream.on("change", function(change) 
        console.log(change);
        // this is where you can fire the socket.emit('the_change', change)
      );
    )
    .catch(err => 
      console.error(err);
  );
);

请注意,使用此方法需要您设置replica set。您可以按照这些说明操作或使用Dockerised replica set such as this one.

【讨论】:

以上是关于Node中不断轮询MongoDB的效率的主要内容,如果未能解决你的问题,请参考以下文章

Node.js中使用MongoDB

node - MongoDB数据库

MongoDB 副本集 pymongo使用

node.js对mongodb的连接&增删改查(附async同步流程控制)

无法运行mongod:致命断言28562

MongoDB常用命令