所以我刚刚开始深入了解Node,我知道I / O是非阻塞的,事件循环是阻塞的,但我想知道的是:
如果您有阻止事件队列的代码,服务器是否仍然可以将传入请求放在队列末尾,还是所有这些请求都会超时/反弹?
答案 0 :(得分:9)
是。服务器仍然可以排队请求。为了演示,我制作了以下文件,它阻止了10秒,运行它,并在另一个终端上卷曲服务器。
require('http').createServer(function(req, res) {
console.log('got a request!');
res.end('hello world!\n');
}).listen(3000);
var t = Date.now();
console.log('blocking..');
while(t + 10000 > Date.now());
console.log('not blocking anymore');
运行它的结果
blocking..
not blocking anymore
got a request!
答案 1 :(得分:4)
这与节点无关,或至少此讨论到目前为止没有引入节点行为的证据。
TCP堆栈本身在没有使用接受套接字的程序的帮助下接受连接到它自己的队列。如果该队列填满,则进一步请求等待TCP连接队列有空间。这种“不可接受的”联系并没有被反弹,但如果事情真的被推迟,它们可能会超时。
然而,最重要的是,使用curl的示例答案并不能证明TCP堆栈的基本行为之外的任何内容,但这可能并不重要,因为原始海报的关注点是连接可能会反弹。只有当你的服务器过载(或者编写得很糟糕)以至于它实际上已经过载时才会发生这种情况,并且转储一些请求是至少为某些用户提供某些服务的最佳机会。