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
相关文章
|
13天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
|
3月前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
120 4
|
4月前
|
缓存 JavaScript Unix
Node.js 多进程
10月更文挑战第8天
50 0
|
6月前
|
JavaScript Windows
NodeJs——如何获取Windows电脑指定应用进程信息
NodeJs——如何获取Windows电脑指定应用进程信息
160 0
|
6月前
|
JavaScript 前端开发
nodejs process进程
nodejs process进程
55 0
|
8月前
|
JavaScript 前端开发 Shell
深入Node.js的进程与子进程:从文档到实践
深入Node.js的进程与子进程:从文档到实践
|
8月前
|
缓存 JavaScript Unix
Node.js 多进程
Node.js 多进程
48 0
|
9月前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
|
6月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
|
7月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
220 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)

热门文章

最新文章