节点集群:如何为每个工人分配单独的server/port?
Node Cluster: How to assign separate server/port to each worker?
我知道我可以使用 Nodes cluster
模块来创建多个 worker 都服务于相同的套接字连接(来自文档的示例):
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// Workers can share any TCP connection
// In this case its a HTTP server
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}
但是,如果我不提供相同的连接而是希望每个工作人员 运行 他们自己的服务器,每个人都在一个单独的端口上侦听怎么办?
您可以将环境变量传递给每个子进程,允许主进程为它们分配端口:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
var pidToPort = {};
var worker, port;
for (var i = 0; i < numCPUs; i++) {
port = 8000 + i;
worker = cluster.fork({port: port});
pidToPort[worker.process.pid] = port;
}
console.log(pidToPort);
cluster.on('exit', function(worker, code, signal) {
// Use `worker.process.pid` and `pidToPort` to spin up a new worker with
// the port that's now missing. If you do so, don't forget to delete the
// old `pidToPort` mapping and add the new one.
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// Start listening on `process.env.port` - but first, remember that it has
// been cast to a string, so you'll need to parse it.
console.log(process.env.port);
}
我知道我可以使用 Nodes cluster
模块来创建多个 worker 都服务于相同的套接字连接(来自文档的示例):
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// Workers can share any TCP connection
// In this case its a HTTP server
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
}
但是,如果我不提供相同的连接而是希望每个工作人员 运行 他们自己的服务器,每个人都在一个单独的端口上侦听怎么办?
您可以将环境变量传递给每个子进程,允许主进程为它们分配端口:
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
var pidToPort = {};
var worker, port;
for (var i = 0; i < numCPUs; i++) {
port = 8000 + i;
worker = cluster.fork({port: port});
pidToPort[worker.process.pid] = port;
}
console.log(pidToPort);
cluster.on('exit', function(worker, code, signal) {
// Use `worker.process.pid` and `pidToPort` to spin up a new worker with
// the port that's now missing. If you do so, don't forget to delete the
// old `pidToPort` mapping and add the new one.
console.log('worker ' + worker.process.pid + ' died');
});
} else {
// Start listening on `process.env.port` - but first, remember that it has
// been cast to a string, so you'll need to parse it.
console.log(process.env.port);
}