Nodejs Cluster入门浅析

前言

单个Nodejs实例在单线程环境下运行。为了更好的利用多核CPU环境,用户有时希望启动一批Node.js 进程用于加载。

快速上手

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
 
if (cluster.isMaster) {
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    // 其它代码
    
} else {
    require("./app.js");
}

负载均衡

我们可以看到可以启动多个worker来处理请求客户端请求。但是这种多进程的模型有个明显的问题

  • 多个进程之间会竞争accept一个连接,产生惊群现象,效率比较低。
  • 由于无法控制一个新的连接有哪个进程来出来,必然导致各worker进程之间的负载非常不均衡。

这就是所谓的惊群现象
简单的来说,多线程/多进程等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群。可以想而知,效率很低,很多进程被内核重新调度唤醒,同时去响应这个事件,当然只有一个进程能够处理成功,其他进程再处理改事件之后重新休眠。这种性能浪费现象就是惊群。

原理

每个worker进程通过使用child_process.fork()函数,基于IPC实现master进程间通信。
fork出的子进程拥有和父进程一致的数据空间,堆,栈等资源,而且是独立的,进程之间不能共存内存空间。但是为什么需要使用cluster呢?

这样的方式仅仅实现了多进程,多进程运行还涉及父子进程通信,子进程管理,以及负载均衡等,cluster已经封装实现了。

refer

https://cnodejs.org/topic/56e84480833b7c8a0492e20c

你可能感兴趣的:(Nodejs Cluster入门浅析)