微信登录

核心模块 - cluster 模块 - 实现多进程集群

Node.js 《核心模块 - cluster 模块 - 实现多进程集群》

引言

在 Node.js 中,由于 JavaScript 是单线程执行的,这意味着在面对高并发场景时,单线程的 Node.js 应用可能无法充分利用多核 CPU 的性能。为了解决这个问题,Node.js 提供了 cluster 模块,它允许我们创建多个 Node.js 进程,形成一个多进程集群,从而充分利用多核 CPU 的优势,提高应用的性能和并发处理能力。

基本概念

主进程(Master Process)

主进程负责创建和管理子进程。它不处理具体的业务逻辑,主要的任务是监控子进程的状态,在子进程出现异常时进行重启等操作。

工作进程(Worker Process)

工作进程是实际处理业务逻辑的进程。主进程会将接收到的请求分发给工作进程进行处理。

cluster 模块的核心方法

方法名 描述
cluster.isMaster 判断当前进程是否为主进程
cluster.fork() 在主进程中创建一个新的工作进程
cluster.on('event', callback) 监听集群事件,如 'exit' 事件可用于监听工作进程的退出

演示代码

下面我们通过一个简单的 HTTP 服务器示例来演示如何使用 cluster 模块实现多进程集群。

  1. const cluster = require('cluster');
  2. const http = require('http');
  3. const numCPUs = require('os').cpus().length;
  4. if (cluster.isMaster) {
  5. console.log(`主进程 ${process.pid} 正在运行`);
  6. // 根据 CPU 核心数创建工作进程
  7. for (let i = 0; i < numCPUs; i++) {
  8. cluster.fork();
  9. }
  10. // 监听工作进程退出事件
  11. cluster.on('exit', (worker, code, signal) => {
  12. console.log(`工作进程 ${worker.process.pid} 已退出,代码: ${code}, 信号: ${signal}`);
  13. // 工作进程退出后,重新创建一个新的工作进程
  14. cluster.fork();
  15. });
  16. } else {
  17. // 工作进程创建 HTTP 服务器
  18. http.createServer((req, res) => {
  19. res.writeHead(200);
  20. res.end(`你好,这是工作进程 ${process.pid}\n`);
  21. }).listen(8000);
  22. console.log(`工作进程 ${process.pid} 已启动,监听端口 8000`);
  23. }

代码解释

  1. 主进程部分

    • 使用 cluster.isMaster 判断当前进程是否为主进程。
    • 通过 for 循环根据 CPU 核心数调用 cluster.fork() 方法创建工作进程。
    • 监听 'exit' 事件,当工作进程退出时,打印退出信息并重新创建一个新的工作进程。
  2. 工作进程部分

    • 创建一个简单的 HTTP 服务器,监听 8000 端口。
    • 当接收到请求时,返回包含当前工作进程 ID 的响应信息。

运行示例

将上述代码保存为 cluster-example.js,然后在终端中运行以下命令:

  1. node cluster-example.js

你会看到类似以下的输出:

  1. 主进程 1234 正在运行
  2. 工作进程 1235 已启动,监听端口 8000
  3. 工作进程 1236 已启动,监听端口 8000
  4. ...

此时,你可以在浏览器中访问 http://localhost:8000,多次刷新页面,你会发现每次返回的工作进程 ID 可能不同,这说明请求是由不同的工作进程处理的。

注意事项

  • 负载均衡:Node.js 的 cluster 模块默认使用 round-robin(轮询)算法进行负载均衡,将请求依次分发给不同的工作进程。
  • 共享资源:工作进程之间是相互独立的,不能直接共享内存。如果需要共享资源,可以使用一些外部存储,如 Redis 等。

总结

通过使用 cluster 模块,我们可以轻松地创建多进程集群,充分利用多核 CPU 的性能,提高 Node.js 应用的并发处理能力。同时,主进程可以监控工作进程的状态,在工作进程出现异常时进行重启,保证应用的稳定性。希望本文能帮助你更好地理解和使用 Node.js 的 cluster 模块。

核心模块 - cluster 模块 - 实现多进程集群