【问题标题】:Node.js Cluster + Express always invoke the same workerNode.js Cluster + Express 总是调用同一个 worker
【发布时间】:2014-07-30 23:35:48
【问题描述】:

我正在尝试使用集群模块与 Express 一起处理多个 http 请求。

使用下面的代码,我可以生成多个工作人员并让他们都在同一个端口上进行监听。大型 for 循环用于模拟 Web 服务器上的繁重负载。

我希望看到的是,如果一个工作人员在第二个请求进来时正忙于处理一个 http 请求,那么另一个工作人员将被调用并处理第二个请求。相反,当我尝试使用 curl 发出多个请求时,所有请求都由一个工作人员按顺序处理;没有其他工作人员被调用,即使他们已经被分叉了。

会不会是我使用 Express 不正确?提前致谢!

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

else {
    var http = require('http'),
    app = require('express')();

    http.createServer(app).listen(31415, function () {
        console.log(process.pid + " listening on 31415");
    });

    app.get('/', function (req, res) {
        var t= 0;
        for(var i=0; i < 100000000; i++){
            t++;
        }
        res.send('done');
    });
}

【问题讨论】:

    标签: node.js http express concurrency cluster-computing


    【解决方案1】:

    尽量不要使用内置模块?

    ma​​ster.js

    var cp = require('child_process');
    var net = require('net');
    // create tcp server listen to a port
    var tcp = net.createServer();
    tcp.listen(8000, function(){
        // detect cpu number, and fork child process
        for (var i=0;i< require('os').cpus().length; i++) {
            var worker = cp.fork('child.js');
            worker.send(i, tcp._handle);
        }
        tcp.close();
    });
    

    child.js

    var express = require('express');
    var app = express();
    process.on('message', function(id, handle){
    
        app.get('/',function(){
            console.log(process.pid+' is listening ...');
        });
        app.listen(handle, function(){
            console.log(process.pid + 'started');
        });
    });
    

    这适用于 express 3.x

    【讨论】:

    • 感谢您的意见!我给了你的代码并尝试,它似乎工作。即使输出仍然表明正在使用同一个工作程序来处理所有请求,但至少服务器能够在执行阻塞操作时接受其他请求。我想知道输出是否由于 express 运行的范围而不准确。
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2011-07-31
    • 2012-12-04
    • 2022-01-10
    • 2015-04-28
    • 2016-05-20
    相关资源
    最近更新 更多