Node.js cluster模块

举报
福州司马懿 发表于 2021/11/19 04:21:54 2021/11/19
【摘要】 cluster是一个nodejs内置的模块,用于nodejs多核处理。cluster模块,可以帮助我们简化多进程并行化程序的开发难度,轻松构建一个用于负载均衡的集群,在一台物理机器上构建一组监听相同端口的...

cluster是一个nodejs内置的模块,用于nodejs多核处理。cluster模块,可以帮助我们简化多进程并行化程序的开发难度,轻松构建一个用于负载均衡的集群,在一台物理机器上构建一组监听相同端口的进程。

通常来说,多个进程监听同一个端口会引起 EADDRINUSE 的异常,而此例的情况是,不同的两个进程使用了相同的文件描述符,且 Node 底层在监听端口时对 socket 设置了 SO_REUSEADDR 选项,这使得此 socket 可以在不同的进程间复用。在多个进程监听同一个端口时,同一时刻文件描述符只能被一个进程使用,这些进程对 socket 的使用是抢占式的。

每个worker进程通过使用child_process.fork()函数,基于IPC(Inter-Process Communication,进程间通信),实现与master进程间通信。

cluster对象
cluster的各种属性和函数

  • cluster.setttings:配置集群参数对象
  • cluster.isMaster:判断是不是master节点
  • cluster.isWorker:判断是不是worker节点
  • Event: ‘fork’: 监听创建worker进程事件
  • Event: ‘online’: 监听worker创建成功事件
  • Event: ‘listening’: 监听worker向master状态事件
  • Event: ‘disconnect’: 监听worker断线事件
  • Event: ‘exit’: 监听worker退出事件
  • Event: ‘setup’: 监听setupMaster事件
  • cluster.setupMaster([settings]): 设置集群参数
  • cluster.fork([env]): 创建worker进程
  • cluster.disconnect([callback]): 关闭worket进程
  • cluster.worker: 获得当前的worker对象
  • cluster.workers: 获得集群中所有存活的worker对象

worker对象
worker的各种属性和函数:可以通过cluster.workers, cluster.worket获得。

  • worker.id: 进程ID号
  • worker.process: ChildProcess对象
  • worker.suicide: 在disconnect()后,判断worker是否自杀
  • worker.send(message, [sendHandle]): master给worker发送消息。注:worker给发master发送消息要用process.send(message)
  • worker.kill([signal=’SIGTERM’]): 杀死指定的worker,别名destory()
  • worker.disconnect(): 断开worker连接,让worker自杀
  • Event: ‘message’: 监听master和worker的message事件
  • Event: ‘online’: 监听指定的worker创建成功事件
  • Event: ‘listening’: 监听master向worker状态事件
  • Event: ‘disconnect’: 监听worker断线事件
  • Event: ‘exit’: 监听worker退出事件
var cluster = require('cluster');
var http = require('http');
var numCpus = require('os').cpus().length;

if(cluster.isMaster) {
    console.log('[master] start, pid: ' + process.pid);

    cluster.on('fork', function(worker){
        console.log('[master] fork, worker: ' + worker.id);
    });
    cluster.on('online', function(worker){
        console.log('[master] online, worker: ' + worker.id);
    });
    cluster.on('listening', function(worker){
        console.log('[master] listening, worker: ' + worker.id);
    });
    cluster.on('disconnect', function(worker){
        console.log('[master] disconnect, worker: ' + worker.id);
    });
    cluster.on('exit', function(worker, code, signal){
        console.log(`[master] exit, worker: ${worker.id}, exitCode: ${code}, signal: ${signal}`);
    });

    for(var i=0; i<numCpus; i++) {
        //只有master进程才可以调用fork, 生成新的worker进程
        cluster.fork();
    }

    console.log(cluster.workers);
    Object.keys(cluster.workers).forEach(function(id){
        cluster.workers[id].on('message', function(msg){
            console.log('[master] received msg: ' + JSON.stringify(msg) + ', from worker ' + id);
        });
    });

    setTimeout(function() {
        for(var id in cluster.workers) {
            cluster.workers[id].send({'data':'master data', 'pid':process.pid});
            cluster.workers[id].disconnect();
        }
    }, 1000);
} else if(cluster.isWorker) {
    console.log(`[worker ${cluster.worker.id}] start, pid: ${process.pid}`);

    process.on('message', function(msg){
        console.log(`[worker ${cluster.worker.id}] received msg: ${JSON.stringify(msg)}`);
    });
    process.on('online', function(){
        console.log('[worker ' + cluster.worker.id + '] online');
    });
    process.on('listening', function(){
        console.log('[worker ' + cluster.worker.id + '] listening');
    });
    process.on('disconnect', function(){
        console.log('[worker ' + cluster.worker.id + '] disconnect');
    });
    process.on('exit', function(){
        console.log('[worker ' + cluster.worker.id + '] exit');
    });

    process.send({'data':'worker data', 'pid':process.pid, 'workerId':cluster.worker.id});

    http.createServer(function(req, res){
        res.writeHead(200);
        res.end(`process ${process.pid} hello world`);
    }).listen(8080);
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

这里写图片描述
注意:凡是有fork函数的,都必须保存到node脚本中执行,不能直接在命令行中执行。

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/52654641

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。