我正在使用 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);
}
关于node.js - Node.js/Express 应用程序中的集群进程阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798866/