node.js中的群集无法正常工作.只有一名工人总是在回应 [英] clustering in node.js is not working. Only one worker is always responding

查看:52
本文介绍了node.js中的群集无法正常工作.只有一名工人总是在回应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am practising clustering in node.js I am having a two core CPU. I created two workers and each worker runs a simple http server. Server response callback will block for 5 sec to give next request to other worker. To verify workers are working parallel, I have opened multiple tabs in Firefox and refreshed each. problem is always(99%) only one worker is responding requests that was make by refreshing tabs. Only one request is being served by one worker and all other requests are blocked until that worker is finished. My code is here CODE:

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)选项卡,则两个工作人员都一个接一个地响应.输出:

I have noticed one thing. If I force reload(ctrl+f5) the tab, then both workers is responding one after other. OUTPUT:

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),我感到困惑.帮我弄清楚...!

I am confused what,s happening here for normal refresh(f5) and force reload( ctrl + f5 ). help me to figure it out...!

推荐答案

TIL似乎没有做到(至少对我来说).

TIL on the surface node clustering does not appear to do what it says it does (at least to me).

我处在与您相同的情况下,当我从浏览器同步生成它们时,观察到总是向同一个工作进程发出请求.我的一位同事用提琴手一次重播了大约20个请求.当所有这些请求以非常快的速度到达服务器时,这比集群管理器将其传递给工作程序的速度快(我猜是这样),然后您将看到通过请求调用其他工作程序.

I was in the same situation you were, observing the same worker process always being given a request when I spawned them synchronously from a browser. A colleague of mine used fiddler to replay ~20 requests at once. When all of those requests hit the server very fast, faster than the cluster manager can pass them off to workers (I'm guessing), then you will see additional workers being invoked with requests.

似乎,一旦经理将请求交给工作人员,它就不知道/不在乎工作人员是否被阻止.它只是知道管道中仅存在一个请求,因此不需要将请求发送给除第一个工作人员以外的任何人,因为据经理所知,他可以使用.

It seems that once the manager hands off the request to a worker, it doesn't know/care about the worker blocking. It just knows that there is only one request in the pipe and there is no need to give that request to anyone other than the first worker because, as far as the manager knows, he's available.

这篇关于node.js中的群集无法正常工作.只有一名工人总是在回应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆