node cluster,cluster nodes

  node cluster,cluster nodes

  本文带你了解Node中的Nodejs-cluster模块,并介绍nodeJS-Cluster模块的用法。希望对你有帮助!

  node.js速度课程简介:进入学习

  有时候面试官会问你,说说nodejs是怎么开始多流程的?您应该立即想到集群模块。现在让我带你讨论一下集群模块的使用。

  

基本用法

   Node.js默认情况下在单个进程中运行。对于32位系统,它可以使用高达512MB的内存,对于64位系统,它可以使用高达1GB的内存。对于具有多核CPU的计算机来说,这是低效的,因为只有一个核心在运行,而所有其他核心都是空闲的。集群模块就是为了解决这个问题而提出的。

  集群模块允许设置一个主进程和几个工作进程,主进程监控和协调工作进程的运行。工作人员通过进程间通信来交换消息。集群模块有一个内置的负载平衡器,使用循环算法来协调工作进程之间的负载。运行时,所有新建立的链接都由主进程完成,然后主进程将TCP连接分配给指定的工作进程。

  var cluster=require( cluster );

  var OS=require( OS );

  if (cluster.isMaster){

  for (var i=0,n=os.cpus()。长度;I n;i=1){

  cluster . fork();

  }

  }否则{

  http.createServer(function(req,res) {

  RES . write head(200);

  RES . end( hello world \ n );

  }).听(8000);

  }上面的代码首先判断当前进程是否为主进程(cluster.isMaster),如果是,则根据CPU核心数创建几个新的工作进程;如果不是,当前进程是一个工作进程,那么在这个进程中启动一个服务器程序。

  上面的代码有一个缺点,就是一旦工作进程挂起,主进程无法知道。要解决这个问题,可以在主进程中部署在线事件和退出事件的监控功能。

  var cluster=require( cluster );

  if(cluster.isMaster) {

  var numWorkers=require(os )。CPU()。长度;

  console.log(主群集设置 numWorkers workers . );

  for(var I=0;i numWorkersi ) {

  cluster . fork();

  }

  cluster.on(online ,function(worker) {

  console . log( Worker Worker . process . PID 在线);

  });

  cluster.on(exit ,函数(worker,code,signal) {

  console . log( Worker Worker . process . PID 死了,代码: code ,信号: signal);

  console.log(启动新的工作线程);

  cluster . fork();

  });

  }在上面的代码中,一旦主进程监测到工作进程的退出事件,就会重新启动一个工作进程。一旦工作进程成功启动并可以正常运行,它将发出一个online事件。

  worker对象

  Worker对象是cluster.fork()的返回值,代表一个工作进程。

  其属性和方法如下。

  (1)工人身份证

  Worker.id返回当前工作线程的唯一进程号。这个数字也是cluster.workers中指向当前进程的索引值。

  (2)工作流程

  的所有工作进程都是使用child_process.fork()生成的。child_process.fork()返回的对象保存在worker.process中通过该属性可以得到worker所在的process对象。

  (3)worker.send()

  此方法用于向主进程中的子进程发送信息。

  if (cluster.isMaster) {

  var worker=cluster . fork();

  worker.send(你好);

  } else if (cluster.isWorker) {

  process.on(消息,函数(消息){

  process . send(msg);

  });

  }上面这段代码的作用是,工作进程回显主进程发送的每一条消息。

  在工作进程中,要向主进程发送消息,请使用process . send(message);要侦听来自主进程的消息,请使用下面的代码。

  process.on(消息,函数(消息){

  console.log(消息);

  });消息可以是字符串或JSON对象。下面是一个发送JSON对象的例子。

  worker.send({

  类型:“任务1”,

  发件人:“主人”,

  数据:{

  //要传输的数据

  }

  });cluster.workers对象

  该对象仅存在于主进程中,包含所有工作进程。每个成员的键值是一个工作进程对象,键值名是工作进程的worker.id属性。

  函数eachWorker(回调){

  for(cluster . workers中的变量id){

  回调(cluster . workers[id]);

  }

  }

  每个工人(职能(工人){

  worker.send(向全体工人大宣布);

  });上面的代码用于遍历所有工作进程。

  当前套接字的数据事件也可用于标识具有id属性的工作进程。

  socket.on(data ,function(id) {

  var worker=cluster . workers[id];

  });cluster模块的属性与方法

  isMaster,isWorker

  master属性返回一个布尔值,该值指示当前进程是否为主进程。该属性由process.env.NODE_UNIQUE_ID确定。如果process.env.NODE_UNIQUE_ID未定义,则表示该进程为主进程。

  IsWorker属性返回一个布尔值,该值指示当前进程是否为工作进程。它与isMaster属性的值相反。

  fork()

  fork方法用于创建新的工作进程,上下文复制主进程。只有主进程可以调用这个方法。

  此方法返回一个worker对象。

  kill()

  kill方法用于终止工作进程。它可以接受代表系统信号的参数。

  如果它当前是主进程,它将终止与worker.process的联系,然后向工作进程发送系统信号方法。如果它当前是一个工作进程,它将终止与主进程的通信,然后退出,返回0。

  在以前的版本中,此方法也称为worker.destroy()。

  listening事件

  在工作进程调用listening方法后,“listening”事件被传输到进程的服务器,然后传输到主进程。

  该事件的回调函数接受两个参数,一个是当前worker对象,一个是address对象,包含URL、端口、地址类型(IPv4、IPv6、Unix socket、UDP)等信息。这对于服务多个URL的节点应用程序非常有用。

  不中断地重启Node服务

  重新启动服务需要在启动前关闭。通过使用集群模块,您可以首先启动一个工作进程,然后关闭所有原始的工作进程。这样,节点服务可以不中断地重新启动。

  首先,主进程向工作进程发送一个重启信号。

  工人[wid]。发送({type: shutdown ,from: master });工作进程监听消息事件,一旦发现内容被关闭,就退出。

  process.on(消息,函数(消息){

  if(message.type===shutdown) {

  process . exit(0);

  }

  });下面是一个关闭所有工作进程的函数。

  函数restartWorkers() {

  var wid,worker id=[];

  for(cluster . workers中的wid

  worker ids . push(wid);

  }

  worker ids . foreach(function(wid){

  cluster.workers[wid]。发送({

  文本:“关机”,

  来自:“主人”

  });

  setTimeout(function() {

  if(cluster.workers[wid]) {

  cluster.workers[wid]。kill( SIGKILL );

  }

  }, 5000);

  });

  };PM2模块

  PM2模块是集群模块的封装层。其功能是尽可能抽象集群模块,使用户可以像部署单进程一样部署多进程节点应用。

  //app.js

  var http=require( http );

  http.createServer(function(req,res) {

  RES . write head(200);

  RES . end( hello world );

  }).听(8080);用PM2从命令行启动这段代码。

  $ pm2 start app.js -i 4上面的代码的I参数告诉pm2,这段代码应该以cluster_mode启动,新创建的工作进程数为4。如果I参数的值是0,那么当前机器有几个CPU核心,PM2将启动几个工作进程。

  如果工作进程由于某种原因挂起,它将立即重新启动。

  #重新启动所有工作进程

  $ pm2 reload所有每个工作进程都有一个id。您可以使用以下命令查看单个工作进程的详细信息。

  当$ pm2 show worker id关闭工作进程时,您可以部署以下代码来让工作进程侦听关闭消息。一旦收到此消息,它将在完成清理后关闭。

  process.on(消息,函数(消息){

  if (msg===shutdown) {

  close _ all _ connections();

  delete _ logs();

  server . close();

  process . exit(0);

  }

  });更多关于node的信息,请访问:nodejs教程!以上就是说说Nodejs-cluster模块,介绍一下它的使用细节。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: