NodeJs:如何处理大量的定时器?

我正在使用socket.io通过websockets发送数据包。 他们似乎不时消失。 所以我必须实施某种确认制度。 我的想法是立即回应一个ACK包的数据包。 如果服务器在给定的时间内没有收到ACK包,他将重新发送(最多3次,然后断开套接字)。

我的第一个想法是发送一个包后启动一个定时器(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的客户端连接很多的stream量。 我无法想象,同时运行的10k个定时器可以被NodeJS使用。 更糟糕的是,我读到NodeJS不会在没有时间的情况下触发事件。

如何实现一个良好的工作和高效的包确认系统?

如果socket.io对你来说不够可靠,你可能要考虑实现你自己的websocket接口,而不是在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); 

超时实际上没有太多的开销; 它基本上只是被放在队列中,直到执行它为止。