这篇文章主要介绍了Node.js进程集群怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node.js进程集群怎么实现文章都会有所收获,下面我们一起来看看吧。
一、cluster模块
Node.js是单线程处理,对于高并发的请求怎么样能增加吞吐量呢?为了提高服务器的利用率,能不能多核的来处理呢?于是就有了cluster模块。
cluster模块可以轻松实现运行在同一机器不同进程上的TCP或HTTP服务器集群。它们仍使用相同的底层套接字,从而在相同的IP地址和端口组合上处理请求。
下面是它的一些事件属性和方法。
事件:
fork:当新的工作进程已经被派生时发出。callback函数接收worker对象作为唯一的参数。function(Worker)
online:当新的进程发回一消息,表明它已经启动时发出。callback同上。
listening:当工作进程调用listen()开始监听端口时发出。callback:fucntion(Worker,address)
disconnect:当IPC通道被切断时发出。如服务器调用worker.disconnect()的时候。callback:function(Worker)
exit:在Worker对象已断开时发出。callback:function(Worker,code,signal)
setup:在setupMaster()被首次调用时发出。
属性和方法:
settings:包含exec(工作进程的javascript文件)、args(传递的参数数组)、silent(断开工作进程的IPC机制)属性值,用于建立集群
isMaster:判断当前进程是否是主进程
isWorker:判断当前进程是否是工作进程
setupMaster([settings]):启动主进程
disconnect([callback]):断开工作进程的IPC机制,并关闭句柄,当断开连接完成时回调
worker:引用在工作进程的当前Worker对象
workers:包含Worker对象,可以通过标识从主进程引用它们。cluster.workers[workerId]
二、Worker对象
当一个工作进程被派时,一个新的Worker对象同时在主进程和工作进程中创建。在工作进程中Worker对象用来表示当前的工作进程,并与正在发生的集群事件进行交互。在主进程中,Worker对象代表子工作进程,是主应用程序向他们发送信息,接收它们的状态变化的事件甚至杀掉他们。
它也是有一些事件属性方法。
事件:
message:在工作进程收到一个新信息时发出,回调函数把message作为唯一的参数值
disconnect:在IPC通道已对这个工作进程断开后发出
exit:Worker对象已经断开时发出
error:工作进程发生错误时发出
属性方法:
id:工作进程标识
Process:工作进程运行的ChildProcess对象
suicide:对这个工作进程调用kill()或disconnect()时被设置为true。可以使用此标志来确定是否要跳出尝试的循环,并退出
send(message,[sendHandle]):将消息发送到主进程
kill([signal]):通过断开IPC通道杀掉当前工作进程,然后退出,将suicide设置为true。
disconnect():工作进程调它时,关闭所有服务器,等待关闭事件,并断开IPC通道。当从主节点调时,发送一个内部消息给工作进程,使其断开本身,设置suicide为true。
三、实践
上面的也都是理论,下面通过实现一个HTTP集群来实践一下。
主进程
var cluster = require('cluster');var http = require('http');if (cluster.isMaster) { cluster.on('fork', function(worker) { console.log("Worker " + worker.id + " created"); }); cluster.on('listening', function(worker, address) { console.log("Worker " + worker.id +" is listening on " + address.address + ":" + address.port); }); cluster.on('exit', function(worker, code, signal) { console.log("Worker " + worker.id +" Exited"); }); cluster.setupMaster({exec:'cluster_worker.js'}); var numCPUs = require('os').cpus().length; for (var i = 0; i < numCPUs; i++) { if (i>=4) break; cluster.fork(); } Object.keys(cluster.workers).forEach(function(id) { cluster.workers[id].on('message', function(message){ console.log(message); }); });}
工作进程
var cluster = require('cluster');var http = require('http');if (cluster.isWorker) { http.Server(function(req, res) { res.writeHead(200); res.end("Process " + process.pid + " says hello"); process.send("Process " + process.pid + " handled request"); }).listen(8080, function(){ console.log("Child Server Running on Process: " + process.pid); });}
HTTP客户端测试
var http = require('http');var options = { port: '8080'};function sendRequest(){ http.request(options, function(response){ var serverData = ''; response.on('data', function (chunk) { serverData += chunk; }); response.on('end', function () { console.log(serverData); }); }).end();}for (var i=0; i<5; i++){ console.log("Sending Request"); sendRequest();}
首先是启动主进程,创建工作进程开始监听
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_server.jsWorker 1 createdWorker 2 createdWorker 3 createdWorker 4 createdChild Server Running on Process: 6152Worker 1 is listening on null:8080Child Server Running on Process: 10340Worker 2 is listening on null:8080Child Server Running on Process: 11412Worker 3 is listening on null:8080Child Server Running on Process: 12120Worker 4 is listening on null:8080
其次启动HTTP客户端测试
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_client.jsSending RequestSending RequestSending RequestSending RequestSending RequestProcess 12120 says helloProcess 11412 says helloProcess 12120 says helloProcess 10340 says helloProcess 6152 says helloProcess finished with exit code 0
关于“Node.js进程集群怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Node.js进程集群怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。