Node.js cluster模块
2023-09-11 14:22:55 时间
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);
}
注意:凡是有fork函数的,都必须保存到node脚本中执行,不能直接在命令行中执行。
相关文章
- 用Node.js写爬虫,撸羞羞的图片
- Node.js 初体验
- 基于Node.js的Java虚拟机:node-jvm
- 《Node.js区块链开发》——1.6 参考
- Node.js(四)—— 内置模块之path路径模块
- js勾选时显示相应内容
- CentOS 6.6 安装 Node.js
- 《Node.js入门经典》一1.2 使用Node.js能做什么
- 《Node.js入门经典》一2.7 如何找模块文档
- Node.js 把抓取到的电影节目列表单发或者群发到QQ邮箱
- 微信小程序~App.js中获取用户信息
- 《Node.js区块链开发》——3.2 PoW:工作量证明机制
- 深入浅出Node.js--数据通讯,NET模块运行机制
- [js高手之路]Node.js模板引擎教程-jade速学与实战4-模板引用,继承,插件使用
- Node.js 模块和包管理器NPM
- node.js—安装bcrypt出现错误的解决办法
- Node.js assert断言
- Node.js DNS模块
- Node.js Path模块
- Node.js readline模块
- Node.js JSON模块
- Node.js Debugger模块
- Node.js UDP / Datagram Sockets模块
- Node.js Zlib模块
- Node.js Errors模块