在Node中连续轮询MongoDB的效率

时间:2016-08-28 21:57:45

标签: node.js mongodb sockets redis socket.io

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

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

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

2 个答案:

答案 0 :(得分:0)

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

如果您需要的数据没有快速变化,比如让我们说几秒钟,您的每个连接仍然每5秒轮询一次,这就是浪费。

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

答案 1 :(得分:0)

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.