推荐答案
// www.javascriptcn.com code example
const cluster = require('cluster');
const os = require('os');
const express = require('express');
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
console.log(`Master process is running. Forking for ${numCPUs} CPUs...`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died. Forking a new one...`);
cluster.fork();
});
} else {
const app = express();
app.get('/', (req, res) => {
res.send('Hello, world!');
});
app.listen(3000, () => {
console.log(`Worker ${process.pid} started`);
});
}本题详细解读
1. 什么是集群 (Cluster)?
集群是 Node.js 提供的一个模块,允许你创建多个子进程(Worker)来共享同一个服务器端口。每个子进程都是一个独立的实例,能够处理请求。通过使用集群,你可以充分利用多核 CPU 的性能,从而提高 Express 应用的并发处理能力。
2. 为什么使用集群?
- 性能提升:Node.js 是单线程的,默认情况下只能利用一个 CPU 核心。通过集群,你可以利用多个 CPU 核心,从而提高应用的并发处理能力。
- 高可用性:如果一个 Worker 进程崩溃,主进程可以立即创建一个新的 Worker 进程来替代它,确保应用的高可用性。
3. 如何使用集群?
- 主进程 (Master Process):主进程负责创建和管理 Worker 进程。它通过
cluster.fork()方法来创建 Worker 进程,并监听 Worker 进程的退出事件,以便在 Worker 进程崩溃时重新创建。 - Worker 进程 (Worker Process):每个 Worker 进程都是一个独立的 Express 应用实例,能够处理请求。Worker 进程通过
cluster.isWorker来判断自己是否为 Worker 进程。
4. 代码解析
- 主进程:
cluster.isMaster判断当前进程是否为主进程。如果是主进程,则根据 CPU 核心数创建相应数量的 Worker 进程。 - Worker 进程:
cluster.isWorker判断当前进程是否为 Worker 进程。如果是 Worker 进程,则启动 Express 应用并监听端口。 - 进程管理:主进程通过
cluster.on('exit', ...)监听 Worker 进程的退出事件,并在 Worker 进程崩溃时重新创建。
5. 注意事项
- 共享状态:由于每个 Worker 进程是独立的,它们之间不共享内存。如果你需要共享状态,可以考虑使用 Redis 或其他外部存储。
- 负载均衡:Node.js 的集群模块会自动进行负载均衡,将请求分配给不同的 Worker 进程。
通过使用集群,你可以显著提高 Express 应用的性能和可靠性,尤其是在高并发场景下。