www.hj8828.comnode.js中cluster的运用教程_node.js_脚本之家

本文主要给大家介绍了关于node.js中cluster使用的相关教程,分享出来供大家参考学习,下面来看看详细的介绍:

结论

一、使用NODE中cluster利用多核CPU

虽然平常通过设置为CPU进程数的工作进程,但是可以超过这个数,并且并不是主进程先创建

var cluster = require; var http = require; var numCPUs = require.length; if  { // 创建工作进程 for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('death', function { console.log('worker ' + worker.pid + ' died'); cluster.fork; } else { // 工作进程创建http 服务器 http.Server { res.writeHead; res.end.listen; } 
if  { // 循环 fork 任务 CPU i5-7300HQ 四核四进程 for (let i = 0; i < 6; i++) { cluster.fork() } console.log(chalk.green(`主进程运行在${process.pid}`))} else { app.listen // export app 一个 Koa 服务器的实例 console.log(chalk.green(`子进程运行在${process.pid}`))}#子进程运行在17768#子进程运行在5784#子进程运行在11232#子进程运行在7904#主进程运行在12960#子进程运行在4300#子进程运行在16056

二、通过消息传递来监控工作进程状态

在主进程中 cluster 表示主进程, process 是本身的进程,worker
表示子进程,通过 cluster.workers 获取

var cluster = require; var http = require; var numCPUs = require.length; var rssWarn =  , heapWarn =  if { for(var i=0; i rssWarn) { console.log('Worker ' + m.process + ' using too much memory.') } } }) } } else { // 服务器 http.createServer { res.writeHead; res.end.listen // 每秒报告一次状态 setInterval{ process.send({memory: process.memoryUsage(), process: process.pid}); }, 1000) } 

在子进程中 process 表示子进程,也可以通过 cluster.worker 表示当前子进程

三、杀死僵尸进程

cluster.worker.process 等价于 process

var cluster = require; var http = require; var numCPUs = require.length; var rssWarn =  , heapWarn =  var workers = {} if { for(var i=0; i rssWarn) { console.log('Worker ' + m.process + ' using too much memory.') } } }) } 

主进程子进程相互通信

总结

cluster 用于监听 process 子进程触发的各种事件 worker
在主进程中获取,用于和自身通信。当子进程触发事件时,会返回当前的 worker
以及相关的信息到主进程相应的事件中 process
主进程本身的进程实例,在通信过程中基本没有用到 process
子进程本身的实例,只能在子进程获取用于监听自身的事件

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

可见主进程与子进程通过这样一个三角关系互相通信,其中 cluster 和 worker
是在主进程中获取的,process 是子进程。 cluster 通过操作 worker
通知子进程,子进程本身和 cluster
进行通信。为什么要这样设计呢?因为子进程会有多个,只有通过 worker
才能选择和哪个进程通信

子进程的调度策略 cluster.schedulingPolicy

调度策略,包括循环计数的
cluster.SCHED_RR,以及由操作系统决定的cluster.SCHED_NONE。
这是一个全局设置,当第一个工作进程被衍生或者调动cluster.setupMaster()时,都将第一时间生效。除Windows外的所有操作系统中,SCHED_RR都是默认设置。只要libuv可以有效地分发IOCP
handle,而不会导致严重的性能冲击的话,Windows系统也会更改为SCHED_RR。cluster.schedulingPolicy
可以通过设置NODE_CLUSTER_SCHED_POLICY环境变量来实现。这个环境变量的有效值包括”rr”
和 “none”。

RR 即 Round-Robin
轮询调度,即每个子进程的获取的事件的机会是均等的,这是除
windows以外默认的。而 windows 下的调度策略很诡异,见下图。目前并没有相关
API 可以设置调度策略的算法,node 只为我们提供了两个值

测试数据为 1000次 并发请求,重复测试20次,在windows下的表现情况。可见
windows 的调度算法表现的杂乱无章。如果是 RR
算法四条进程的调度应该处于同一横线上。暂时没在本地搭建 linux
环境,有条件的同学可以协助测试一波。cluster的调度算法目前至于系统有关

多进程间的鉴权问题

注意:Node.js不支持路由逻辑。因此在设计应用时,不应该过分依赖内存数据对象。由于各工作进程是独立的进程,它们可以根据需要随时关闭或重新生成,而不影响其他进程的正常运行。只要有存活的工作进程,服务器就可以继续处理连接。如果没有存活的工作进程,现有连接会丢失,新的连接也会被拒绝。Node.js不会自动管理工作进程的数量,而应该由具体的应用根据实际需要来管理进程池。

文档中已明确说明了,每一个工作进程都是独立的,并且互相之间除了能够进行通信外,没有办法共享内存。所以在设计鉴权的时候,有两种方法

通过共有的主进程存储鉴权信息,每次前端提交帐号密码,授权完成后,将 token
发送给主进程,下次前台查询时先在主进程获取授权信息 通过统一的外部 redis
存取