node js cluster - 它是如何工作的

时间:2016-10-11 14:56:27

标签: node.js

我尝试创造工人,但工作正常。它有四个核心,在多次尝试时,它只显示来自一个工作人员的消息。

    var app = express();
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));


if (cluster.isMaster) {
    var cpuCount = os.cpus().length ;
    console.log("No. of cpus:", cpuCount);
    for(var i = 0; i < cpuCount; i++) cluster.fork();

    cluster.on('listening', function(worker, address) {
        console.log('woker id:' + worker.id +' is now listening on port:' + address.port);
    });
} else {
    console.log("i'm a worker.. ... lets proceed");
    var server = app.listen(8082, function(req, res) {

        var host = server.address().address;
        var port = server.address().port;
        request(i18n.__('url.config'), function(error, response, body){
            if (!error && response.statusCode == 200) {
            } else {
                console.log("Config error",error);
            }
        });
    }); // child process

}// else

//Listen for dying workers
cluster.on('exit', function (worker) {
    // Bring that ... ..er  back
    console.log('Worker %d died :', worker.id);
    cluster.fork();
});

cluster.on('online', function (worker) {
    // worker is alive
    console.log('Worker %d is alive :', worker.id);
});

app.get('/hey', function(req, res){
    console.log('Worker %d running!', cluster.worker.id);
    res.send('Hello World from worker ' + cluster.worker.id);
});

后来我修改了代码来实例化并在worker(else循环)中创建了express对象。输出相同。

    if (cluster.isMaster) {
    var cpuCount = os.cpus().length ;
    console.log("No. of cpus:", cpuCount);
    for(var i = 0; i < cpuCount; i++) cluster.fork();

    cluster.on('listening', function(worker, address) {
        console.log('woker id:' + worker.id +' is now listening on port:' + address.port);
    });
} else {
    var app = express();

    console.log("i'm a worker.. ... lets proceed");
    var server = app.listen(8082, function(req, res) {

        var host = server.address().address;
        var port = server.address().port;
        request(i18n.__('url.config'), function(error, response, body){
            if (!error && response.statusCode == 200) {
            } else {
                console.log("Config error",error);
            }
        });

        app.get('/hey', function(req, res){
            console.log('Worker %d running!', cluster.worker.id);
            res.send('Hello World from worker ' + cluster.worker.id);
        });
    }); // child process

}// else
  

node --debug server.js

     

调试器侦听端口5858

     

没有。 of cpus:4

     

调试器侦听端口5859

     

调试器侦听端口5860

     

调试器侦听端口5861

     

调试器侦听端口5862

     

我是一名工人......让我们继续

     

woker id:1正在侦听端口:8082

     

我是一名工人......让我们继续

     

我是一名工人......让我们继续

     

我是一名工人......让我们继续

     

woker id:4正在侦听端口:8082

     

woker id:3正在侦听端口:8082

     

woker id:2正在侦听端口:8082

     

工人2正在运行!

     

工人2正在运行!

     

工人2正在运行!

     

工人2正在运行!

哪种工人创造方式是正确的?既然它在端口上侦听,全局创建快速对象,会不会引起任何问题?

1 个答案:

答案 0 :(得分:0)

Node.js中的群集允许您创建可以共享相同服务器端口的单独进程。

当一个worker从主进程中分离出来时,它会从模块的开头重新运行代码。因此,它将创建Express应用程序,路由,然后侦听给定端口。

但是如何在工人之间分配请求?显然,他们不能(而且不应该)全都在倾听并回应我们得到的每一个请求。为了解决这个问题,集群模块中实际上有一个嵌入式负载均衡器,用于处理不同工作者之间的分发请求。在Linux和OSX(但不是Windows)上,循环(cluster.SCHED_RR)策略默认生效。

您可能也想知道不同进程如何共享单个端口。运行如此多处理网络请求的进程的困难部分是传统上只有一个可以同时打开一个端口。集群的最大好处是它可以为您处理端口共享,因此任何打开的端口(如Web服务器)都可供所有子设备访问。这是通过IPC完成的,这意味着主服务器只是将端口句柄发送给每个工作者。

cluster.fork()会启动一个新的V8实例。

应谨慎使用。每个工作者都占用系统资源,因此只生成那些真正需要的系统资源。

话虽这么说,回答你的问题,这两种方法中的任何一种都可以。

由于fork创建了一个新实例,因此全局创建对象并不会产生影响。

下面的链接说明了cluster.fork和child_process.fork https://millermedeiros.github.io/mdoc/examples/node_api/doc/cluster.html