我正在使用 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 客户端连接到大量流量。我无法想象,NodeJS 可以处理同时运行的 10k 个计时器。更糟糕的是:我读到如果没有时间,NodeJS 不会触发该事件。
如何实现一个工作良好且高效的数据包确认系统?