NodeJS是一种基于JavaScript的开发渠道,它能够让开发者运用JavaScript编写服务器端的运用程序。NodeJS的一个特点是它采用了单线程的事情驱动模型,这意味着它能够高效地处理大量的并发恳求,而不需求创立多个线程或进程。

为什么需求主从形式

但是,单线程也有一些局限性,比方:

  • 假如遇到CPU密集型的使命,如图像处理、加密解密等,单线程会堵塞其他恳求的处理,导致功能下降。
  • 假如遇到异常或过错,单线程会崩溃,导致整个运用程序停止运转。
  • 假如需求运用多核CPU的优势,单线程无法充分发挥硬件资源。

为了处理这些问题,NodeJS供给了一种主从形式(Master-Worker Pattern),也叫做集群形式(Cluster Mode)。主从形式是一种常见的分布式体系设计形式,它由一个主进程(Master Process)和多个从进程(Worker Process)组成。主进程负责办理和监控从进程,从进程负责处理详细的事务逻辑。

怎样完成主从形式

在NodeJS中,主从形式能够经过cluster模块来完成。cluster模块能够让开发者轻松地创立多个子进程,并且供给了一些办法和事情来控制和通讯。运用cluster模块的基本步骤如下:

  • 引入cluster模块,并判别当时进程是主进程还是从进程。
  • 假如是主进程,运用cluster.fork()办法创立若干个从进程,并绑定一些事情来监听从进程的状况和音讯。
  • 假如是从进程,执行详细的事务逻辑,并运用process.send()办法向主进程发送音讯。

根底用法

以下是运用 cluster 模块的基本示例:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
    console.log(`Master ${process.pid} is running`);
    // Fork workers.
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died`);
    });
} else {
    // Workers can share any TCP connection.
    // In this case, it is an HTTP server.
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('Hello from Worker!');
    }).listen(8000);
    console.log(`Worker ${process.pid} started`);
}

在上面的代码中,主进程首先查看它是否是主进程(cluster.isMaster)。假如是,它会创立与体系CPU核心数量相同的作业进程。每个作业进程都是主进程的一个独立实例,它们都有自己的内存,并运转在自己的V8实例中。作业进程经过 http.createServer 创立HTTP服务器并开始监听恳求。

假如一个作业进程崩溃或被杀死,exit事情会被触发,你能够在这里重新启动作业进程。

进阶用法 – 结合Nginx的负载均衡

运用 Nginx 作为反向代理和负载均衡器。Nginx 能够将传入的恳求分发到多个 Node.js 进程。

Nginx 装备示例:

http {
    upstream node_cluster {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        # ... other Node.js processes
    }
    server {
        listen 80;
        location / {
            proxy_pass http://node_cluster;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
    }
}

在上述装备中,Nginx 将传入的恳求均衡地分发到 node_cluster 中界说的多个 Node.js 进程。

运用主从形式的优势

  1. 负载均衡:在单个服务器上运转多个Node.js进程,这样能够均衡分配到来的恳求,进步体系的吞吐量。
  2. 容错和高可用性:假如一个作业进程崩溃,它能够被主进程重新启动,而不会影响其他作业进程。
  3. CPU密集型使命:Node.js 是单线程的,对于CPU密集型使命,能够运用多个作业进程来防止堵塞主线程。

注意事项

  • 状况共享:因为每个作业进程都是独立的,它们之间不共享内存。假如你的运用需求状况共享(例如,会话状况),你需求运用外部服务或数据库。

总归,Node.js 的 Master-Worker 形式经过 cluster 模块供给了一个简单而强大的办法来创立多进程运用,从而进步功能和可靠性。