在事件队列被阻止时,Node.js服务器是否可以接受传入请求?

Cor*_*son 5 blocking node.js

所以我刚刚开始深入了解Node,我知道I/O是非阻塞的,并且事件循环是阻塞的,但我想知道的是:

如果您有阻止事件队列的代码,服务器是否仍然能够将传入的请求放在队列的末尾,或者所有这些请求都只是超时/反弹?

fen*_*ent 8

是.服务器仍然可以排队请求.为了演示,我制作了以下文件,它阻止了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');
Run Code Online (Sandbox Code Playgroud)

运行它的结果

blocking..
not blocking anymore
got a request!
Run Code Online (Sandbox Code Playgroud)


Tob*_*itt 5

这与节点无关,或者至少到目前为止的讨论没有引入节点行为的证据。

TCP 堆栈本身接受连接到其自己的队列中,而无需使用接受套接字的程序的帮助。如果该队列已满,则会发出进一步的请求,直到 TCP 连接队列有空间为止。这种“不可接受的”连接不会被退回,但如果事情确实延迟,它们可能会超时。

然而,底线是使用curl 的示例答案并没有证明超出TCP 堆栈基本行为的任何内容,但这可能并不重要,因为原始发布者担心连接可能会反弹。只有当您的服务器过载(或者可能写得很糟糕)以至于实际上过载时,才会发生这种情况,并且转储一些请求是它至少为某些用户提供某些服务的最佳机会。