Node.js和socket.io - 在推送数据库之前累积数据

时间:2013-08-20 10:36:36

标签: mysql node.js socket.io pool

我是Node.js和Socket.io的新手。我想知道我是否积累了用户从UI输入的数据,然后,这些数据在服务器上收集并按时间间隔推送数据库。例如,不同的用户不断地从他们的帐户输入消息,并且这些数据在服务器上收集。每隔1分钟,收集的数据就会进入数据库,数据池将耗尽。是否可以使用node.js和socket.io?

1 个答案:

答案 0 :(得分:1)

您可以在NodeJS中轻松实现此类结果。

只需在hashmap中累积您的消息(假设每个用户使用一个密钥)并在每分钟触发超时,以将您的hashmap刷新到您的数据库中。

var messages = {};

io.sockets.on('connection', function (socket) {

  socket.on('message', function (data) {
    // data.id is user id, data.content the message
    if (!(data.id in messages)) {
       messages[data.id] = []
    }
    messages[data.id].push(data.content);
  });

});

var flush = function() {
  for (userId in messages) {
    // ... write in database

    // effectively flush messages
    messages[userId] = [];
  }
  // Don't forget to set agin the next flush
  setTimeout(flush, 1000);
}

setTimeout(flush, 1000);

它是一个天真的解决方案,很容易设置和测试。

不要使用setInterval,它在CPU时间上非常贪婪。

由于此示例是单线程的,因此在数据库上写入的(短)时间内,您的服务器将不可用。

如果您需要高可用性服务器,请考虑使用另一个进程来存储和刷新邮件,并将其发送给您,而不是将其存储到主(通信)过程中。