如何使用Node.js运行多个并行的HTTP请求
我们知道NodeJS应用程序是单线程的。假设处理包括需要10秒的请求A,这并不意味着后续的请求需要等待10秒才开始处理,因为NodeJS事件循环只是单线程的。整个NodeJS架构并非单线程。
NodeJS如何处理多个客户端请求?
NodeJS接收多个客户端请求,并将它们放入 事件队列 中。NodeJS是基于事件驱动架构构建的。NodeJS有自己的 事件循环 ,它是一个无限循环,接收请求并处理。事件循环是事件队列的监听器。
如果NodeJS能够在没有I/O阻塞的情况下处理请求,事件循环将自行处理请求并将响应自己发送回客户端。但是,可以使用NodeJS的 集群 模块或 worker_threads 模块来并行处理多个请求。
如何使用集群模块扩展NodeJS应用程序?
单个Node.js实例在单个线程中运行。如果您有多核系统,可以利用每个核心。有时开发人员想要启动一个NodeJS进程集群,以利用多核系统。
集群模块允许轻松创建共享相同服务器端口的子进程。
步骤1: 创建一个NodeJS应用程序并安装所需的 Express.js 模块。
mkdir Project && cd Project
npm init -y
npm i express
步骤2: 在根目录下创建一个 index.js 文件,并复制以下代码。
const express = require('express');
const cluster = require('cluster');
// Check the number of available CPU.
const numCPUs = require('os').cpus().length;
const app = express();
const PORT = 3000;
// For Master process
if (cluster.isMaster) {
console.log(`Master {process.pid} is running`);
// Fork workers.
for (let i = 0; i{worker.process.pid} died`);
});
}
// For Worker
else{
// Workers can share any TCP connection
// In this case it is an HTTP server
app.listen(PORT, err =>{
err ?
console.log("Error in server setup") :
console.log(`Worker ${process.pid} started`);
});
}
解释: 如果您的系统有8个CPU,则将创建8个NodeJS实例,每个实例都有自己独立的事件循环。现在NodeJS可以并行处理所有请求。
它们都共享相同的端口(端口3000),但状态不同。主进程监听一个端口,接受新的连接并以循环方式在工作进程之间分配它们,带有一些内置智能来避免过载一个工作进程。
步骤3: 使用以下命令运行 index.js 文件。
node index.js
输出:
使用Worker Threads模块: Worker Thread是解决CPU性能问题的最佳方案。在Node.js中使用该模块有助于执行繁重的JavaScript任务。
不同于:
- 一个进程
- 一个线程
- 一个事件循环
- 一个JS引擎实例
- 一个Node.js实例
- Worker threads拥有:
一个进程
- 多个线程
- 每个线程一个事件循环
- 每个线程一个JS引擎实例
- 每个线程一个Node.js实例
示例: 创建一个index.js文件,代码如下所示:
index.js
const {Worker} = require('worker_threads');
const worker = new Worker(__filename);
worker.on('message', message => console.log(message));
worker.postMessage('GeeksforGeeks');
worker.emit(true)
使用以下命令运行服务器:
node --experimental-worker index.js
注意: 我们必须使用 --experimental-worker ,因为Workers线程模块仍处于实验阶段。
输出:
{ name: ‘GeeksforGeeks’ }
Worker_Threads的优点:
- 传递原生句柄(http/https请求)
- 死锁检测。
- 更高的隔离性,因此如果一个进程受到影响,不会影响其他进程。
Worker_Threads的缺点:
-
不适用于I/O操作。
- 创建工作线程不廉价。