2017-04-07 36 views
0

我正在使用具有node.js的集群模块从多个cpu核心(我的情况是4)中受益。问题是,如果工作人员忙,下一个请求仅在大约10秒后被委派给另一个可用工作者,这是不可接受的。我使用无限循环来测试群集如下:节点js - 请求委托之前的集群延迟

var cluster = require ('cluster'); 

if (cluster.isMaster) { 
    var cpuCount = require('os').cpus().length; 
    for (var i = 0; i < cpuCount-1; ++i) { 
     cluster.fork(); 
    } 
} else { 
    var express = require('express'); 
    var app = express(); 

    app.get('/', function (req, res) { 
     console.log('Served by worker %d!', cluster.worker.id); 
     while(true) {} 
     console.log("done"); 
     res.status(200).send(); 
    }); 

    app.listen(8080, function() { 
     console.log('Worker %d running!', cluster.worker.id); 
    }); 
} 

cluster.on('exit', function (worker) { 
    console.log('Worker %d died :(', worker.id); 
    cluster.fork(); 
}); 

起初我打开本地主机:在浏览器8080和日志信息“由工人1先得”瞬间打印。然后,我在新标签中打开相同的页面,并且仅在10秒后打印“由工作人员2提供”。为什么会这样,我如何将请求立即委托给可用的工作人员?

+0

我的猜测是'cluster'依靠主进程和子进程能够相互通信。如果您完全用无限循环阻止子进程,则该通信将被有效阻止。 – robertklep

回答

0

哪个核心运行load-balancer方法?也许平衡器太忙了,因为无限循环将请求发送到其他应用程序。

事实上一个for..loop同步工作,并且如果load-balancer方法是在相同的应用程序和核心与loop然后负载平衡器从不工作,如果有一个inifinite循环。

我强烈建议使用PM2来创建群集。一个已经开发了多年的图书馆提供的远远超出了你的期望。

祝你好运..

+0

感谢您的咨询!但是,pm2根据AGPL获得许可。这会对商业软件造成一些限制吗?我通常更喜欢MIT/BSD许可的图书馆。 – eko