我正在使用Express框架开发Node.js应用程序,并且使用集群来处理负载。在测试中,我注意到,如果由于某种原因其中一个过程需要很长时间才能加载,它也会影响其他后续请求。我为此做了一个简单的测试用例:
https://gist.github.com/anonymous/7325816
使用“ node app.js”运行示例,并尝试http://localhost:8080/slow
在一个浏览器窗口中http://localhost:8080/fast
立即加载(其阻塞计算需要几秒钟),然后立即在另一个窗口中加载,后者也需要花费几秒钟的时间来加载。
如果我理解正确,那是因为运行计算的同一个进程正在尝试处理新请求:但是如何避免这种情况呢?
编辑:
这是运行/ slow后运行Siege的HTTP请求的输出:
HTTP/1.1 200 0.01 secs: 89 bytes ==> GET /fast
HTTP/1.1 200 6.32 secs: 89 bytes ==> GET /fast
HTTP/1.1 200 0.01 secs: 89 bytes ==> GET /fast
HTTP/1.1 200 6.84 secs: 89 bytes ==> GET /fast
HTTP/1.1 200 0.00 secs: 89 bytes ==> GET /fast
HTTP/1.1 200 7.41 secs: 89 bytes ==> GET /fast
HTTP/1.1 200 0.00 secs: 89 bytes ==> GET /fast
HTTP/1.1 200 9.04 secs: 89 bytes ==> GET /fast
编辑2:
问题是OSX上运行的Node.js的最新Git版本(v0.11.9-pre):运行当前版本v0.10.21,它可以正常运行,而无需将请求传输到阻止的进程。感谢@goten的建议!
如果您有多个CPU内核,则群集应运行多个进程。在那里很好解释了http://rowanmanning.com/posts/node-cluster-and-express/
var http = require('http');
var cluster = require('cluster');
var express = require('express');
if(cluster.isMaster){
//count the CPU
var cpuCount = require('os').cpus().length;
// Create a worker for each CPU
for (var i = 0; i < cpuCount; i += 1) {
cluster.fork();
}
}
else{
var app = express();
var server = http.createServer(app);
app.get('/slow', function(req, res){
someSlowFunction();
});
app.get('/fast', function(req, res){
someFasterFunction();
});
server.listen(3000);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句