Node.js 中的 进程

简介: Node.js 中的 进程

进程

服务模型变迁

  1. 同步 QPS:1/N
  2. 复制进程 进程上限为 M, QPS:M/N
  3. 多线程 设线程占用资源未进程的 1/L,QPS:M * L / N
  4. 事件驱动

多进程架构

Master-Worker 模式(主从模式)

// worker.js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello world\n');
}).listen(Math.round((1 + Math.random()) * 1000), '127.0.0.1');

// master.js
var fork = require('child_process').fork;
var cpus = require('os').cpus();
for (var i = 0; i < cpus.length; i++) {
  fork('./worker.js');
}
  • 创建子进程

    • spawn() 启动一个子进程来执行命令
    • exex() 启动一个子进程来执行命令,与 spawn() 不同的是其接口不同,有一个回调函数获知子进程的状况
    • execFile() 启动一个子进程来执行可执行文件
    • fork() 与 spawn() 类似,不同点在于它创建 Node 的子进程只需要指定要执行的 JS 文件模块即可
    var cp = require('child_process');
    cp.spawn('node', ['worker.js']);
    cp.exec('node worker.js', function (err, stdout, stderr) {
      // code
    });
    cp.execFile('worker.js', function (err, stdout, stderr) {
      // code
    });
    cp.fork('./worker.js');
  • 进程间通信

    • Node 中实现 IPC 通道的是管道技术(pipe)
    // parent.js
    var cp = require('child_process');
    var n = cp.fork(__dirname + '/sub.js');
    
    n.on('message', function (m) {
      console.log('PARENT got message:', m);
    });
    n.send({hello: 'world'});
    
    // sub.js
    process.on('message', function (m) {
      console.log('CHILD got message:', m);
    });
    process.send({foo: 'bar'});
  • 句柄传递

    • 句柄是一种可以标识资源的引用,内部包含了指向对象的文件描述符
    • 句柄可以用来标识一个服务器端 socket 对象,一个客户端 socket 对象,一个 UDP 套接字,一个管道等
    • child.send(message, [sendHandle])

集群

  • 进程事件

    • send()
    • kill()
    • message
    • error
    • exit
    • close
    • disconnect
  • 自动重启

    • 通过监听子进程的 exit 事件来获知其退出的信息
    // master.js
    var fork = require('child_process').fork;
    var cpus = require('os').cpus();
    
    var server = require('net').createServer();
    server.listen(1337);
    
    var workers = {};
    var createWorker = function () {
      var worker = fork(__dirname + './worker.js');
      // 退出时重新启动新的进程
      worker.on('exit', function () {
        console.log(`Worker ${worker.pid} exited.`);
        delete workers[worker.pid];
        createWorker();
      });
      worker.send('server', server);
      workers[worker.pid] = worker;
      console.log(`Create worker.pid: ${worker.pid}`);
    };
    
    for (var i = 0; i < cpus.length; i++) {
      createWorker();
    }
    
    // 进程自己退出时,让所有工作进程退出
    process.on('exit', function () {
      for (var pid in workers) {
        workers[pid].kill();
      }
    });
  • 负载均衡

    • Node 默认提供的机制是采用操作系统的抢占式策略
    • 在 v0.11 中提供了一种新的策略 Round-Robin 轮叫调度
  • 状态共享

    • 三方数据存储,如数据库、磁盘文件、缓存服务,需定时轮询
    • 主动通知,也需要一种机制获取数据的改变,不脱离轮询,但可以减少轮询的进程数量

Cluster

// cluster.js
var cluster = require('cluster');

cluster.setupMaster({
  exec: 'worker.js'
});

var cpus = require('os').cpus();
for (var i = 0; i < cpus.length; i++) {
  cluster.fork();
}
  • cluster 工作原理

    • 本质是 child_process 和 net 的组合应用
  • cluster 事件

    • fork
    • online
    • listening
    • disconnect
    • exit
    • setup
相关文章
|
前端开发
bat 批处理文件 结束node进程 杀死指定端口
bat 批处理文件 结束node进程 杀死指定端口
|
4月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
135 1
|
1月前
|
JavaScript Windows
NodeJs——如何获取Windows电脑指定应用进程信息
NodeJs——如何获取Windows电脑指定应用进程信息
58 0
|
1月前
|
JavaScript 前端开发
nodejs process进程
nodejs process进程
22 0
|
3月前
|
JavaScript 前端开发 Shell
深入Node.js的进程与子进程:从文档到实践
深入Node.js的进程与子进程:从文档到实践
|
3月前
|
缓存 JavaScript Unix
Node.js 多进程
Node.js 多进程
24 0
|
4月前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
node子进程(Child Process)获取硬盘分区
node子进程(Child Process)获取硬盘分区
51 0
|
JSON 资源调度 负载均衡
这可能是你见过最全的Node.js应用程序管理与部署:使用PM2进行进程管理
node是单线程应用,单线程最大的弊端就是无法利用多核CPU带来的优势来提升运行效率。 pm2(process manager)是一个进程管理工具,可以用它来管理node进程,负责所有的node进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。
439 0
这可能是你见过最全的Node.js应用程序管理与部署:使用PM2进行进程管理
|
JavaScript 前端开发 PHP
Node.js:concurrently同时启动运行多个进程
Node.js:concurrently同时启动运行多个进程
314 0