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 进程。
运用主从形式的优势
- 负载均衡:在单个服务器上运转多个Node.js进程,这样能够均衡分配到来的恳求,进步体系的吞吐量。
- 容错和高可用性:假如一个作业进程崩溃,它能够被主进程重新启动,而不会影响其他作业进程。
- CPU密集型使命:Node.js 是单线程的,对于CPU密集型使命,能够运用多个作业进程来防止堵塞主线程。
注意事项
- 状况共享:因为每个作业进程都是独立的,它们之间不共享内存。假如你的运用需求状况共享(例如,会话状况),你需求运用外部服务或数据库。
总归,Node.js 的 Master-Worker 形式经过 cluster
模块供给了一个简单而强大的办法来创立多进程运用,从而进步功能和可靠性。