【问题标题】:Node.js and socket.io - Accumulate datas before pushing databaseNode.js 和 socket.io - 在推送数据库之前累积数据
【发布时间】:2013-08-20 10:36:36
【问题描述】:

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

【问题讨论】:

    标签: mysql node.js socket.io pool


    【解决方案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 时间非常贪婪。

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

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

    【讨论】:

    • 感谢您的回复@Feugy。你的意思是因为服务器性能问题,我必须将消息一一写入数据库?
    • 不,绝对不是 :) 我只是说,如果写入数据库需要几秒钟,你不应该在主进程中执行,而使用另一个专门用于此任务的进程
    猜你喜欢
    • 2019-05-02
    • 2013-01-19
    • 2015-02-11
    • 2012-12-04
    • 2020-03-24
    • 2017-04-15
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多