node.js - NodeJs : How to handle a very high amount of timers?

标签 node.js timer socket.io settimeout

我正在使用 socket.io 通过 websockets 发送数据包。他们似乎时不时地消失。所以我必须实现某种确认系统。我的想法是立即用 ACK 数据包响应数据包。如果服务器在给定的时间内没有收到这个ACK-packet,他就会重新发送它(最多3次,然后断开socket)。

我的第一个想法是在发送数据包后启动一个计时器(setTimeout)。如果发生超时事件,则必须重新发送数据包。如果 ACK 到达,超时将被删除。非常简单且简短。

var io = require('socket.io').listen(80);

// ... connection handling ...

function sendData(someData, socket) {
  // TODO: Some kind of counter to stop after 3 tries.
  socket.emit("someEvent", someData);
  var timeout = setTimeout(function(){ sendData(someData, socket); }, 2000);
  socket.on("ack", function(){
    // Everything went ok.
    clearTimeout(timeout);
  });
}

但我将有 1k-3k 个客户端连接,流量很大。我无法想象 NodeJS 可以处理同时运行的 10k 个计时器。 更糟糕:我读到,如果没有时间,NodeJS 将不会触发该事件。

如何实现一个良好运行且高效的数据包确认系统?

最佳答案

如果 socket.io 对您来说不够可靠,您可能需要考虑实现自己的 websocket 接口(interface),而不是在 socket.io 之上添加一层。但要回答你的问题,我认为运行 10k 计时器并不是什么大问题。例如,以下代码对我来说运行时间不到 3 秒,并打印出预期结果 100000:

var x = 0;
for (var i = 0; i < 100000; i++) {
    setTimeout(function() { x++; }, 1000);
}

setTimeout(function() { console.log(x); }, 2000);

超时实际上并没有那么多开销;它本质上只是被放入队列中,直到执行它为止。

关于node.js - NodeJs : How to handle a very high amount of timers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18226630/

相关文章:

node.js - windows只读属性中的nodejs fs模式操作

javascript - 使用计时器在 Javascript 中使用参数设置动画

java - 如何创建在Android后台进程中设置计时器的程序

node.js - 如何在 heroku 上部署 Node Media Server 应用程序

sockets - 可以用ack实现socket.io,如果服务端没有收到ack,服务端再尝试发出事件?

javascript - Node.js 异步遍历对象数组

node.js - 在 node.js 中将模块导入为 const 和 var 的区别

javascript - Sublime Text 2 - 使用 Node.js 构建 javascript

带有 ActionListeners 的 Java 作用域

socket.io - Socket.IO 中是否有 io.connect() 方法的回调?