我正在使用 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/