所以我刚刚开始深入了解Node,我知道I/O是非阻塞的,并且事件循环是阻塞的,但我想知道的是:
如果您有阻止事件队列的代码,服务器是否仍然能够将传入的请求放在队列的末尾,或者所有这些请求都只是超时/反弹?
是.服务器仍然可以排队请求.为了演示,我制作了以下文件,它阻止了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)
这与节点无关,或者至少到目前为止的讨论没有引入节点行为的证据。
TCP 堆栈本身接受连接到其自己的队列中,而无需使用接受套接字的程序的帮助。如果该队列已满,则会发出进一步的请求,直到 TCP 连接队列有空间为止。这种“不可接受的”连接不会被退回,但如果事情确实延迟,它们可能会超时。
然而,底线是使用curl 的示例答案并没有证明超出TCP 堆栈基本行为的任何内容,但这可能并不重要,因为原始发布者担心连接可能会反弹。只有当您的服务器过载(或者可能写得很糟糕)以至于实际上过载时,才会发生这种情况,并且转储一些请求是它至少为某些用户提供某些服务的最佳机会。
| 归档时间: |
|
| 查看次数: |
1702 次 |
| 最近记录: |