node.js - 当其中一个 fork 陷入阻塞操作时,其他集群 fork 无法获取请求

标签 node.js

我有一个简单的 http 服务器,但它在服务请求之前会执行一些阻塞操作。因此,我认为如果其中一个子进程陷入阻塞进程,则 fork 一些子进程应该能够处理更多请求。

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 个 fork 。但它总是停留在只处理 1 个请求上。如果我同时打开 2 个或更多指向该地址的选项卡,我至少应该能够在控制台中立即多次看到 req get,对吗?但我只见过1次。所有其他请求都无法被其他可能空闲的 fork 接收。

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

只有当其中一个死亡时,我才会看到另一个 fork 正在处理待处理的请求

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

当其中一个 fork 陷入阻塞操作时,是什么阻止我的其他 fork 监听新请求?

最佳答案

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

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

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

关于node.js - 当其中一个 fork 陷入阻塞操作时,其他集群 fork 无法获取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31040895/

相关文章:

javascript - 没有 v8-profiler 的 Node.js 内存泄漏搜索

node.js - 部署到 Digital Ocean 的 Meteor 应用程序卡在 100% CPU 和 OOM

javascript - 无法从 Node js中的函数返回数据

javascript - Node.js (node-pg) 或 C (libpq) - 执行 PostgreSQL 请求而不等待响应?

node.js - GitHub Action 中的 npm install 失败并显示 "ENOENT: no such file or directory"- 在其他地方工作正常

node.js - 你能从 mongo 访问 mongoose 创建的数据库吗?

javascript - Firebase Cloud Function 错误,函数返回未定义、预期 Promise 或值

javascript - 我可以防止 Express 中的多个静态目录产生 404 吗?

javascript - 本地主机中带有 Node.JS 的 CSS/JS

node.js - 按日期排序 Mongoose 抛出错误记录超过 9