gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:45:46 25 4
gpt4 key购买 nike

我正在使用 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 不会触发事件。

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

最佳答案

如果 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 - Node : How to handle a very high amount of timers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18226630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com