nodeJS中的聚类

时间:2018-04-10 08:40:56

标签: javascript node.js load-balancing

我正在尝试创建一个多进程应用程序,但我遇到了NodeJS集群api的问题。现在它非常简单,但是我无法使它工作。这是我的代码。 Clustering.js:

var cluster = require('cluster');

var port = 8101;

if (cluster.isMaster) {

 var startChooser = function (chooserId) {
     cluster.fork({WorkerName: chooserId, port: port});
     port++;
 }
}
else {
    console.log(process.env.WorkerName);
}

module.exports.startChooser = startChooser

这是我做主要的简单测试:

var clustering = require('./clustering');

clustering.startChooser('12345');

问题在于它显示此错误:

/usr/local/bin/node /Users/../../main.js
12345
/Users/../../main.js:38
clustering.startChooser('12345');
           ^

TypeError: clustering.startChooser is not a function
    at Object.<anonymous>         (/Users/../../main.js:38:12)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3

所以,显然它正在工作,因为它正在打印workerName,但它显示出错误。

1 个答案:

答案 0 :(得分:1)

如果要对应用程序进行分组,请使用PM2(https://github.com/Unitech/pm2)。它更容易,您不需要修改代码。它会自动假设您的代码是子进程,pm2管理所有进程,它也会为您提供监控。

它也可以帮助您避免错误,并且它是一个经过良好测试的库。

你的问题:

群集的主要概念是你的主文件是需要子代码分叉的人。你的问题只是当你是主人时才定义函数startChooser ...如果你的进程是一个孩子,那么函数没有被定义。

酷教程: http://dealwithjs.io/scaling-clustering-in-node-js/ https://rowanmanning.com/posts/node-cluster-and-express/

以下是如何使用群集模块的示例。如果你想要重生一个孩子,你应该听'退出'事件。

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

if (cluster.isWorker) {
  require('./worker-lib')
} else {
  console.log('I am a master');
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
}