node集群(cluster)

本文详细介绍了Node.js的cluster模块,用于在多核服务器中创建进程以提高性能。主要内容包括工作进程如何共享端口、如何处理端口占用问题以及源码解读,揭示了主进程如何监听端口并分配请求给工作进程,从而避免端口冲突。
摘要由CSDN通过智能技术生成

使用例子

为了让node应用能够在多核服务器中提高性能,node提供cluster API,用于创建多个工作进程,然后由这些工作进程并行处理请求。

// master.js
const cluster = require('cluster');
const cpusLen = require('os').cpus().length;
const path = require('path');

console.log(`主进程:${
     process.pid}`);
cluster.setupMaster({
   
  exec: path.resolve(__dirname, './work.js'),
});

for (let i = 0; i < cpusLen; i++) {
   
  cluster.fork();
}

// work.js
const http = require('http');

console.log(`工作进程:${
     process.pid}`);
http.createServer((req, res) => {
   
  res.end('hello');
}).listen(8080);

上面例子中,使用cluster创建多个工作进程,这些工作进程能够共用8080端口,我们请求localhost:8080,请求任务会交给其中一个工作进程进行处理,该工作进程处理完成后,自行响应请求。

端口占用问题

这里有个问题,前面例子中,出现多个进程监听相同的端口,为什么程序没有报端口占用问题,由于socket套接字监听端口会有一个文件描述符,而每个进程的文件描述符都不相同,无法让多个进程都监听同一个端口,如下:

// master.js
const fork = require('child_process').fork;
const cpusLen = require('os').cpus().length;
const path = require('path');

console.log(`主进程:${
     process.pid}`);
for (let i = 0; i < cpusLen; i++) {
   
  fork(path.resolve(__dirname, './work.js'));
}

// work.js
const http = require('http');

console.log(`工作进程:${
     process.pid}`);
http.createServer((req, res) => {
   
  res.end('hello');
}).listen(8080);

当运行master.js文件的时候,会报端口被占用的问题(Error: listen EADDRINUSE: address already in use :::8080)。

我们修改下,只使用主进程监听端口,主进程将请求套接字发放给工作进程,由工作进程来进行业务处理。

// master.js
const fork = require('child_process').fork;
const cpusLen = require('os').cpus().length;
const path = require('path');
const net = require('net');
const server = net.createServer();

console.log(`主进程:${
     process.pid}`);
const works = [];
let current = 0
for (let i = 0; i < cpusLen; i++) {
   
  works.push(fork(path.resolve(__dirname, './work.js')));
}

server.listen(8080, () => {
   
  if (current > works.length - 1) current = 0
  works[current++].send('server', server);
  server.close();
});

// work.js
const http = require('http');
const server = http.createServer((req, res) => {
   
  res.end
Node.js 中,可以使用 cluster 模块来实现集群cluster 模块允许我们创建一个主进程(称为主节点),然后创建多个子进程(称为工作节点)来处理请求。这些工作节点可以在同一台计算机上,也可以在不同的计算机上。 下面是一个简单的示例: ```javascript 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 world\n'); }).listen(8000); console.log(`Worker ${process.pid} started`); } ``` 在这个示例中,我们首先检查当前进程是否为主进程。如果是,我们创建多个子进程并在它们之间分配请求,否则,我们创建一个 HTTP 服务器来处理请求。 在这个示例中,我们使用了 `os` 模块来获取计算机的 CPU 数量,然后为每个 CPU 创建一个子进程。我们还监听了 `exit` 事件以处理工作节点的异常退出。 要运行这个示例,可以使用以下命令: ``` $ node app.js ``` 这将启动主进程和多个子进程来处理请求。由于每个子进程都是独立运行的,因此可以在同一台计算机上处理更多的请求,也可以在多台计算机上创建工作节点来处理更多的请求。 需要注意的是,在使用集群时,我们需要确保我们的应用程序是可扩展的,并且可以在多个工作节点上运行而不会出现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值