javascript - node.js 中的集群不起作用。只有一名工作人员始终响应

标签 javascript node.js

我正在 node.js 中练习集群我有一个双核 CPU。我创建了两个工作人员,每个工作人员都运行一个简单的 http 服务器。服务器响应回调将阻塞 5 秒,以将下一个请求提供给其他工作人员。为了验证工作人员是否并行工作,我在 Firefox 中打开了多个选项卡并刷新了每个选项卡。问题总是 (99%) 只有一名工作人员正在响应通过刷新选项卡发出的请求。一个工作人员只处理一个请求,所有其他请求都被阻止,直到该工作人员完成。我的代码在这里 代码:

var cluster = require('cluster');
var http = require('http');



if (cluster.isMaster) {
    var cpus = require('os').cpus().length;
    console.log('No of cpus:' + cpus);
    console.log(require('os').cpus());

    for (var i = 0; i < cpus; i++) {
        cluster.fork();
    }

    cluster.on('fork', function(worker) {
        console.log('worker:' + worker.id + " is forked");
    });
    cluster.on('online', function(worker) {
        console.log('worker:' + worker.id + " is online");
    });
    cluster.on('listening', function(worker) {
        console.log('worker:' + worker.id + " is listening");
    });
    cluster.on('disconnect', function(worker) {
        console.log('worker:' + worker.id + " is disconnected");
    });
    cluster.on('exit', function(worker) {
        console.log('worker:' + worker.id + " is dead");
    });

} else {
    http.createServer(function(req, res) {

        console.log('worker:' + cluster.worker.id + " going to send response ");
        res.writeHead(200);
        res.end("hello world. worker: " + cluster.worker.id);
        var stop = new Date().getTime();
        while (new Date().getTime() < stop + 5000) {;
        }
    }).listen(8000);
}

输出:

20 Aug 00:36:11 - [nodemon] restarting due to changes...
20 Aug 00:36:12 - [nodemon] starting `node cluster.js`
No of cpus:2
[ { model: 'Intel(R) Core(TM)2 Duo CPU     E4500  @ 2.20GHz',
    speed: 2200,
    times: { user: 2264671, nice: 0, sys: 698343, idle: 5965109, irq: 98812 } },
  { model: 'Intel(R) Core(TM)2 Duo CPU     E4500  @ 2.20GHz',
    speed: 2200,
    times: { user: 2466000, nice: 0, sys: 502562, idle: 5959203, irq: 4609 } } ]
worker:1 is forked
worker:2 is forked
worker:2 is online
worker:1 is online
worker:2 is listening
worker:1 is listening
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response
worker:1 going to send response

我注意到一件事。如果我强制重新加载(ctrl+f5)选项卡,那么两个工作人员都会一个接一个地响应。 输出:

worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response
worker:1 going to send response
worker:2 going to send response

我很困惑正常刷新(f5)和强制重新加载(ctrl + f5)这里发生了什么。帮我弄清楚...!

最佳答案

从表面上看,TIL Node 集群似乎并没有按照它所说的去做(至少对我而言)。

我和你处于同样的情况,当我从浏览器同步生成它们时,观察到同一个工作进程总是收到请求。我的一位同事使用 fiddler 一次重播约 20 个请求。当所有这些请求以非常快的速度到达服务器时,速度快于集群管理器将它们传递给工作人员的速度(我猜),然后您将看到其他工作人员被请求调用。

似乎一旦经理将请求交给 worker ,它就不知道/不关心 worker 的阻塞。它只知道管道中只有一个请求,除了第一个工作人员之外,没有必要将该请求提供给任何人,因为据经理所知,他有空。

关于javascript - node.js 中的集群不起作用。只有一名工作人员始终响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25391551/

相关文章:

javascript - 脚本 - 每 x 秒单击一次按钮

node.js - 无法读取未定义的属性 'client_secret'

node.js - 表达 res.download() 并未实际下载文件

javascript - 重新加载商店会删除过滤器

javascript - 不显示文字

javascript - 隐藏从 SD 卡库下载的文件 - PhoneGap

node.js - 如何将 token 从中间件传递到路由

javascript - 我如何漂亮地打印 javascript 对象/变量?

angularjs - Angular $http GET 不将字符串传递到后端。不明确的?

JavaScript 对象按字母顺序排列