Node.js Cluster + Express始终调用同一个worker

时间:2014-06-10 09:10:55

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

我正在尝试使用群集模块与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');
    });
}

1 个答案:

答案 0 :(得分:3)

尽量不要使用内置模块?

<强> master.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');
    });
});

这适用于快递3.x