Node.js的集群功能以及在Express的配置


Node.js在v0.6.0版本下內置了集群功能,作為cluster模塊,用於nodejs的多核處理,也比較容易通過腳本實現一個負載均衡的集群。

 腳本參考了其他人的材料,建立一個server.js(因為虛擬機只有1核,為模擬多線程,所以采用numCPUs+4)

var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log('[master] ' + "start master..."); for (var i = 0; i < numCPUs+4; i++) { cluster.fork(); } cluster.on('listening', function (worker, address) { console.log('[master] ' + 'listening: worker' + worker.id + ',pid:'
+ worker.process.pid + ', Address:' + address.address + ":" + address.port); }); } else if (cluster.isWorker) { console.log('[worker] ' + "start worker ..." + cluster.worker.id); http.createServer(function (req, res) { console.log('worker'+cluster.worker.id); res.end('worker'+cluster.worker.id+',PID:'+process.pid); }).listen(3000); }

 

啟動服務器可以看到日志

$ node server.js [master] start master... [worker] start worker ...1 [master] listening: worker1,pid:2925, Address:0.0.0.0:3000 [worker] start worker ...3 [master] listening: worker3,pid:2931, Address:0.0.0.0:3000 [worker] start worker ...4 [master] listening: worker4,pid:2932, Address:0.0.0.0:3000 [worker] start worker ...2 [master] listening: worker2,pid:2930, Address:0.0.0.0:3000 worker4 worker2 worker1 worker3 worker4 worker2 worker1

通過curl訪問可以看到route到不同的進程
curl 192.168.1.20:3000 worker4,PID:2932 curl 192.168.1.20:3000 worker2,PID:2930

但如何和我們的Express框架結合起來呢,通過npm start實際上是啟動了package.json上的script腳本
node ./bin/www

具體打開www文件,發現詳細的創建Server的命令,所以需要直接修改這個文件.修改如下:

#!/usr/bin/env node

/**
* Module dependencies.
*/

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
var app = require('../app');
var debug = require('debug')('myapp-express:server');
var http = require('http');

if (cluster.isMaster) {
console.log('[master] ' + "start master...");

for (var i = 0; i < numCPUs+4; i++) {
cluster.fork();
}

cluster.on('listening', function (worker, address) {
console.log('[master] ' + 'listening: worker' + worker.id + ',pid:' + worker.process.pid + ', Address:' + address.address + ":" + address.port);
});

} else if (cluster.isWorker) {
console.log('[worker] ' + "start worker ..." + cluster.worker.id);
http.createServer(app).listen(3000);
/*
http.createServer(app) {
console.log('worker'+cluster.worker.id);
res.end('worker'+cluster.worker.id+',PID:'+process.pid);

}).listen(3000);*/
}



啟動后能正常訪問網頁

但在后台的日志中無法顯示調用的process的信息所以我們不知道是否真的作到負載均衡了.

 

研究了一下,頁面還是走到routes目錄下的index.js模塊,所以在index.js下加入console.log信息,這樣基本上訪問的時候就知道是走到哪個進程實現調用

 

router.get('/about',function(req,res) {
console.log(process.pid);
res.render('about',{titile:"Introduction"});
});

 

 經過實踐,同一個firefox的請求會路由到同一個進程pid,關閉在重新打開會路由到另一個pid.





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM