当其中一个分支卡在阻塞操作中时,其他群集分叉无法获取请求

时间:2015-06-25 03:51:08

标签: node.js

我有一个简单的http服务器,但它在提供请求之前会执行一些阻止操作。因此,我认为如果其中一个进程陷入阻塞过程,那么分配一些子进程应该会处理更多请求。

var cluster = require('cluster');
if (cluster.isMaster) {
    cluster.on('exit', cluster.fork);
    cluster.fork(); cluster.fork(); cluster.fork(); 
    return;
}

var http = require('http');
http.createServer(function(req, res) {
    console.log('req get');
    var i = 0;
    while (i++ < 100000000) setTimeout(); // blocking operation
    res.end('Hello World\n');
    console.log('req served');
}).listen(80);
console.log('Server listening on port 80');

它开始3个叉子。但它始终只是处理1个请求。如果我同时打开两个或多个指向该地址的标签,我至少应该能够在控制台中看到req get那么多次,对吧?但我只看到它一次。所有其他请求无法通过可能空闲的其他分支接收。

Server listening on port 80
Server listening on port 80
Server listening on port 80
req get

只有当其中一个人死亡时,我才会看到另一个叉子接收待处理的请求

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
req get
Server listening on port 80

当其中一个分支卡在阻塞操作中时,什么阻止我的其他分支听取新请求?

1 个答案:

答案 0 :(得分:1)

这里的问题不在节点中。尝试使用curl或类似工具发出并行请求。您将看到,正如预期的那样,每个进程一次处理一个请求,总共有3个并发请求。

这里的问题是您的浏览器。从测试开始,浏览器似乎不愿意一次向同一个域发出多个并发请求。

但是,我找不到这方面的文档 - 似乎大多数浏览器都打算每个域至少发出2个,有时甚至更多的并发请求。这可能是localhost上的一个特例 - 当我将本地服务器代理到远程计算机并通过远程域请求它时,我看到了不同的行为。