一、介绍

Node 在 v0.8 时直接引入了 cluster 模块,用以解决多核 CPU 的利用率问题,同时也提供了较完善的 API,用以处理进程的健壮性问题。

c通信工程前20大学线程池的七个参数luster 模块调命令行常用命令用 fork 方法来创建子进程,该方法与 c服务器地址hild_process 中的 fork 是同一Windows个方命令行窗口怎么打开法(玩转 node 子进程 — child_procwindows7旗舰版ess)服务器配置。 cluste服务器怎么搭建r 模块采用的是经典的主从模型,cluster 会创建一服务器的作用个 ma服务器是什么ster,然后根据你指通信技术专业定的数命令行指令量复制出多个子进程,可以使用cluster.isMaster 属性判断当前进程是 master 还是 worker (工作进程)。由 master 进程来服务器租用管理所有的子进程,主进程不负责具体的任务处理,主要工作是负责调度和管理。

cluster 模命令行参数块使用内置的命令行负载均衡来更好地处理线程之间的压力,该负载均衡使用了 Round-robi线程撕裂者服务器租用多少钱一年n 算法(也被称之为循环算法)。当使用 R命令行关机ound-robin 调度策略时,master accepts(通信) 所有传入线程数越多越好吗的连接请求,然后将相应的TCP请求处理发送windows键是哪个给选中的工作进程(该方式线程数仍然通过 IPC 来进行命令行)。 官方使用实例如下所示

const cluster = require('cluster');
const cpuNums = require('os').cpus().length;
const http = require('http');
if (cluster.isMaster) {
  for (let i = 0; i < cpuNums; i++){
    cluster.fork();
  }
  // 子进程退出监听
  cluster.on('exit', (worker,code,signal) => {
    console.log('worker process died,id',worker.process.pid)
  })
} else {
  // 给子进程标注进程名
  process.title = `cluster 子进程 ${process.pid}`;
  // Worker可以共享同一个 TCP 连接,这里是一个 http 服务器
  http.createServer((req, res)=> {
    res.end(`response from worker ${process.pid}`);
  }).listen(3000);
  console.log(`Worker ${process.pid} started`);
}

其实,clust服务器是什么er 模块由 child_process 和 net 模块的组合应用,cl服务器地址uster 启动时,会在内部启动 TCP 服务器,在 cluster.fork() 子进程时,将这个 TCP 服务器端 socket 的文件描述符发送给工作进程。如果工作进程是通命令行如何切换到d盘过 cluster.fork() 复制出来的,那线程么它的环境变量里就存在 NODE_UNIQUE_ID,如果工作进程中存在 listen() 侦听网络端口的命令行界面调用,它命令行参数是什么意思将拿到文件描述符,通过 SO_REUSEADDR 端口重用,windows11有必要升级吗从而实现多个子进程共享端口。windows10

二、cluster 事线程的几种状态

  1. fork:复制一个工作进程后触发该事件;
  2. online:windows怎么激活复制好一个工作进程后,工作进程主动发送一条 online 消息给主进程,主通信工程进程收到消息后,触windows7旗舰版发该事件;
  3. lis通信tening:工作进程中调用 listen() (共享了服务器端 Socket)后,发送一条 liste服务器系统ni命令行界面ng 消息给主进程,主进程收到消息后,触发该事件;
  4. disconnect:命令行指令主进程和工作进程之间 IPC 通道断开后会触通信发该事件;
  5. exit:线程和进程的区别是什么有工作进程退出时会触发该事件;
  6. s命令行指令etup:cluwindows怎么激活ster.setupMaster() 执行完后触发该事件;

这些事件大多跟 child_process 模块的事件相关,在进程间消息传递的基础上完成的封装。

cluster.on('fork', ()=> {
  console.log('fork 事件... ');
})
cluster.on('online', ()=> {
  console.log('online 事件... ');
})
cluster.on('listening', ()=> {
  console.log('listening 事件... ');
})
cluster.on('disconnect', ()=> {
  console.log('disconnect 事件... ');
})
cluster.on('exit', ()=> {
  console.log('exit 事件... ');
})
cluster.on('setup', ()=> {
  console.log('setup 事件... ');
})

三、master 与 worker 通信

由以上可知,ma通信大数据行程卡ster 进程通过通信人家园 cluster.fork() 来创建 worker 进程,其实,cluster.fork() 内部是通过 child服务通信地址器租用多少钱一年_process.fork() 来创建子进程。也就是说:master 与 worker 进程是父、命令行子进程的关系;其跟 chi通信工程前20大学ld_process 创建的父子进程一命令行如何切换到d盘样是线程的概念通过 IPC 通道进行通信的。

IPC 的全称是 Inter-Proc服务器租用ess Communication,即进程间通信,进程间通信的目的是为了让不同的进程能够通信务器系统互相访问资源并进行协调工作。Node 中实现 IPC 通道的是管道(pipe)技命令行术,线程的几种状态具体实现由 libuv 提供,在 Wi服务器操作系统银河麒麟ndows 下由命名管道(named pipe)实现,*nix 系统则采用 Unix Domain Socket 实现。其变现在应用层上的进程间通信只有简单的 message 事件和 se线程池nd 方法,使用十windows7旗舰版分简单。

玩转 Node.js 集群

父进程在实际创建子进程windows10之前,会创建命令行窗口怎么打开 IPC 通道并监听它,然后才真正创建出子进程,并通过环境变量(NODE_CHANNEL_FD)告诉子进程这个 IPC 通道的文件描述符。子进程在启动过程中,根据文件描述符去连接这个已存在的 IPC 通道,从而完成父子进程之线程数间的连接。

玩转 Node.js 集群

建立命令行连接之后的父子进程就可以进行自由通信了。由于 IPC 通道是用命名管命令行参数是什么意思道或 Domain Socket 创建的,它们与网络 soc命令行查看ip地址ket 的行为比较类似,属于双Windows向通信。不同的是它们在系统内核中就完成了进程间的通信,而不用经过实际的网络层,非常高效。在 Node 中,IPC 通道被抽象为 Stream 对象,在调用 send 时发送数据(类似于 write ),接收到的消息会通过 message 事件(类通信地址似于 data)触发给通信人家园通信技术专业用层windows10激活密钥。 ​

ma线程池ster 和 worker 进程在 server 实例的创建过程中,是通过 IPC 通道进行通信的,那会不会对windows10激活密钥我们的开发造成干扰呢?比如,收到一堆其实并不需要关心的消息?答案肯定是不会?服务器地址那么是怎么做到的呢? ​

Node 引入进程间发送句柄的功能,send 方法除了能通过 IPC 发送数据外,还能发送句柄,第命令行界面二个参数通信为句柄,如下所示

child.send(meeage, [sendHandle])

句柄是一种可以用来标识资源的引用通信技术,它的内部包windows10激活密钥含了指向对象的通信文件描述符。例如句线程数越多越好吗服务器通信技术配置柄可以用来标识一个线程池服务器端 socket 对象、一个客户端 socket 对象、一个 UDPwindows是什么意思 套接字服务器怎么搭建、一个管道等。 那么句柄发送跟我们直接将服务器对象发送给通信行程卡子进程命令行界面有没有什么差别?它是否服务器操作系统银河麒麟真的将服务器对象发送给子进程?

其实 send() 方法在将消息发服务器的作用送到 I通信工程前20大学PC 管道前通信地址是写什么地址,将消息组装成两个对象,一个参数是 handle,另一个服务器怎么搭建是 message,message 参数如下所示

{
  cmd: 'NODE_HANDLE',
  type: 'net.Server',
  msg: message
}

发送到 IPC 管道中的实际上是要发送的句柄文件描述符,其为一个整服务器租用数值。这线程的几种状态个 message 对象在写入到 I服务器配置PC 管道时会通过 JSON.stringify 进行序列化,转化为字符串。子进程通过连线程数越多越好吗通信工程 IPC 通道读取父进程发送来的消息,将字符串通服务器地址过 JSON.parse 解析还原为对象后,才触发线程数越多越好吗 message 事服务器线程的作用件将windows更新有必要吗消息体传递给应用层使用。在这个过程中,消息对象还要被进行过滤处理,mess线程是什么意思age.windows10激活密钥cmd 的值如果以 NODE_ 为windows怎么激活前缀,它将响应一个内部事件 inwindows怎么激活ternalMessage ,如果 message.cmd 值为 NODE_服务器HANDLE,它将取出 mwindows7旗舰版essage.type服务器是什么 值和服务器配置服务器操作系统银河麒麟到的文件描述符一起还原出一个对应的对象。这个过程的示意命令行窗口怎么打开图如下所示

玩转 Node.js 集群

在 cluster 中,以 worker 进程通线程的几种状态知 master 进程创建 server 实例为例子。通信行程卡worker 伪代线程池码如下:

// woker进程
const message = {
  cmd: 'NODE_CLUSTER',
  type: 'net.Server',
  msg: message
};
process.send(message);

master 伪代码如下:

worker.process.on('internalMessage', fn);

四、如何实现端口共享

在前面的例子中,多个通信工程前20大学 woker 中创建的 server 监听了同个端口 3000,通常来说,多个进程监听同个端口,系统会报 EADDRINUSE 异常。为什么 cluster 没通信地址问题通信地址是写什么地址呢?

因为独立启动的进程中,TC命令行窗口怎么打开P 服务器端 socket 套接字的线程的概念文件描述符并不相同,导致监听到相同的端口时通信技术专业会抛出异常。但对于 send() 发线程的概念送的句柄还原出来的服务而言,它们的文件描线程和进程的区别是什么述符是相同的,所以监听相同端口不会引起异常。

这里需要注意的是,多个应用监听相同端口时,文件描述符同一时间只能被某个进程所用,换言之就是网络请求向服务器端发送时,只有一个幸运的进程能够抢到连接,也就线程池是说只有它能为这个请求进行服务,这些进程服务是抢占式的。

五、如何将请求分发到多个worker服务器的作用

  • 每当 worker 进程创建 server 实例来监听请求,都会通过 IPC 通道,在 master 上进行注册。当客线程池的七个参数户端请windows是什么意思求到达,master 会负责将请求转发给对应的 worker;
  • 具体转发给哪个 worker?这是由转发策略决定的,可以通过环境变量 NODE_CL命令行窗口怎么打开Uwindows无法连接到打印机STER_SCHED_通信技术POLICY 设置,也可以在 cluster.setupMaster(options) 时传入,默认的转发策略是轮询(SCHED_RR);
  • 当有服务器租用客户请求到达,master 会轮询一遍 worker 列表,找到第一个空闲的 worker,然后将该请求转发给该windows10激活密钥worker;

六、pm2 工作原通信工程

pwindows键是哪个m2 是 node 进通信程管理工具,可以利用它来简化很多 node 应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,如果在实践中没有使用通信行程卡通信地址是写什么地址 pm2 的通信人家园同学可以查看笔通信技术者的另一篇文章《pm2 实践指南》

pm2 自身是基于 cluster 模命令行关机块进行封装的, 本节我们服务器怎通信技术么搭建主要 pm2 的 Satan 进程、God Daemonwindows10 守护进程 以及两者之间的进程间远程调用 RPC。

撒旦(Satan),主要指《圣经》中的堕天使(也称堕windows10激活密钥天使撒旦),被看作与上帝的力量通信人家园相对的邪恶、黑暗之源,是God 的对立面。

玩转 Node.js 集群

其中 Satan.js服务器操作系统银河麒麟 提供程序的退出、杀死等方法,God.js 负责维持进程的正常运行,God 进程启动后一直运行,相当于 cluster 中的 Master进程,维持 worker 进程的正常运行。

RPC(Remowindows更新有必要吗te Proced线程池u线程池re Call Protocol)是指远程过程调用,也就是说两台线程和进程的区别是什么服务器A,B,一个应用部署命令行如何切换到d盘在A服务器租用 服务器上,想要调用 B 服务器上应用提供的函数/方法,由于不在通信工程专业一个内存通信人家园空间,不能直接调用,需要通命令行快捷键过网络来表达调用的语义和传达调用的数据。同一机器不同进程间通信工程专业的方法调用也属于 rpc 的作用范畴。 执行流程如下所示

玩转 Node.js 集群

每次命令行的输入都会执行一次 satan 程序通信技术专业,如果 God 进程不在运行,首先需要启动 God 进程。然后根据指令,Satan 通过 rpc 调通信技术用 God 中对应的方法通信地址执行相应的逻辑。

pm2 start awindows是什么意思pp.js -i 4 为例,God 在初次执行时会服务器租用配置 cluster,同时监听 cluster 中的事件:

// 配置cluster
cluster.setupMaster({
  exec : path.resolve(path.dirname(module.filename), 'ProcessContainer.js')
});
// 监听cluster事件
(function initEngine() {
  cluster.on('online', function(clu) {
    // worker进程在执行
    God.clusters_db[clu.pm_id].status = 'online';
  });
  // 命令行中 kill pid 会触发exit事件,process.kill不会触发exit
  cluster.on('exit', function(clu, code, signal) {
    // 重启进程 如果重启次数过于频繁直接标注为stopped
    God.clusters_db[clu.pm_id].status = 'starting';
    // 逻辑
    // ...
  });
})();

在 God 启动后, 会建立 Sat命令行快捷键an 和 G线程的几种状态od 的rpc链接,然后调用 prepare 方法,prepawind服务器ows10re 方法会调用 cluswindows键是哪个ter.fork 来完成集群的启动

God.prepare = function(opts, cb) {
  // ...
  return execute(opts, cb);
};
function execute(env, cb) {
  // ...
  var clu = cluster.fork(env);
  // ...
  God.clusters_db[id] = clu;
  clu.once('online', function() {
    God.clusters_db[id].status = 'online';
    if (cb) return cb(null, clu);
    return true;
  });
  return clu;
}

七、命令行如何切换到d盘总结

本文从 cluster 的基本使用、事件,到 cluster 的基本实现原理,再到 pm通信工程2 如何基于 cluster 进行进命令行关机程管理,带你从入服务器操作系命令行窗口怎么打开统银河麒麟门到深入原理以及了解其高阶应用,希望对你有线程的几种状态帮助。

博客 github地址为:github.com/fengshi123/…,汇总了作者的所有博客,也欢迎关注及 star ~

参考文献:

  • 深入理解Node.js 中的进程与线程
  • Node.js进阶:cluster模块深入剖析
  • node 中文网
  • 深入浅出 nodejs