2016-10-11 26 views
0

我试图创建工人,它工作正常。它有四个内核,多次尝试时,它只显示来自一名工作人员的消息。节点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循环)中创建表达对象的创建。输出是一样的。

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 

节点--debug server.js

调试端口监听5858

CPU的数目: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正在运行!

哪种工作者创作方式正确?自从它在港口收听以来,在全球范围内创建表达对象会造成任何问题?

回答

0

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

当工作人员离开主进程时,它会从模块的开头重新运行代码。所以它会创建Express应用程序,一个路线,然后监听给定的端口。

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

您可能还想知道不同的进程如何共享单个端口。运行这么多处理网络请求的进程的难点在于传统上只有一个端口可以一次打开。群集最大的好处就是它可以为你处理端口共享,所以你所有的端口都可以被所有的孩子访问,比如网络服务器。这是通过IPC完成的,这意味着主人只是将端口句柄发送给每个工人。

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

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

这就是说,要回答你的问题,这两种方法中的任何一种都可以。

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

下面的链接解释了有关cluster.fork和child_process.fork https://millermedeiros.github.io/mdoc/examples/node_api/doc/cluster.html

+0

感谢,对xplanation和纽带。 – Martin