node.js - Node.js/Express 应用程序中的集群进程阻塞

标签 node.js

我正在使用 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/

相关文章:

javascript - 将日期转换为耗时

javascript - 无法在电子邮件中显示背景图片

mysql - node-mysql - 返回列包含字符串的行

javascript - 我如何在 Bookshelf Js 和 knex 中写这个

node.js - Linux 上的 NodeJS USB 模块问题

javascript - 从 Node 中的 CronJob 调用 API 没有响应

node.js - 使用 sails.js 和 postgreSQL 时出错(使用 sails-postgresql 模块)

javascript - Node.js 模块导出 "pre-load"

mysql - 异步和 Knex : how they work ?

javascript - AWS : Is createLogGroup operation idempotent?