node.js - 在 Expressjs 应用程序中使用集群

标签 node.js express

我正在我的第一个 Node 项目上做一些 OJT,虽然我可以建立一个简单的服务器,但该应用程序会受到重创,因此使用集群似乎是个好主意。我拼凑了一些在各种搜索(包括 SO)中找到的代码片段,但服务器无法启动。我确信我对 Node 的缺乏经验让我做了一些愚蠢的事情,但我没有看到它。

var express = require( 'express' );
var cluster = require( 'cluster' );
var path    = require( 'path' );

var cCPUs   = require( 'os' ).cpus().length;
var port    = 3000;
var root    = path.dirname( __dirname );

if( cluster.isMaster ) {
    for( var i = 0; i < cCPUs; i++ ) {
      cluster.fork();
    }

    cluster.on( 'death', function( worker ) {
      console.log( 'Worker ' + worker.pid + ' died.' );
    });
}
else {
    // eyes.inspect( process.env );
    console.log( 'Worker: %s', process.env.NODE_WORKER_ID );

    var app = express();
    var routes  = require( './routes' )( app );
    app
      .use( cluster.repl( root + 'cluster.repl' ) )
      .use( cluster.stats({ connections: true, requests: true }) )
      .use( cluster.reload( root ) )
      .listen( port );
}

结果:

TypeError: Object #<Cluster> has no method 'repl'

如果我删除 use 调用,worker 会正确启动,但 process.env.NODE_WORKER_IDundefined。检查 process.env 告诉我它肯定没有定义。也许我使用的代码片段来自旧版本,但我不确定如何以任何其他方式识别工作线程。

如果有人能解开我打乱的任何内容,我将不胜感激。

最佳答案

对于以后搜索的任何人,这是我最终得到的结果:

const cluster = require('cluster');
const express = require('express');
const path = require('path');

const port = 3000;
const root = path.dirname(__dirname);
const cCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Create a worker for each CPU
    for (let i = 0; i < cCPUs; i++) {
        cluster.fork();
    }
    cluster.on('online', function (worker) {
        console.log('Worker ' + worker.process.pid + ' is online.');
    });
    cluster.on('exit', function (worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died.');
    });
} else {
    const app = express();
    const routes = require('./routes')(app);
    app.use(express.bodyParser()).listen(port);
}

我还处于 Node 学习曲线的早期阶段,但服务器启动并且似乎在每个核心上都在运行。感谢 JohnnyH 让我走上正轨。

关于node.js - 在 Expressjs 应用程序中使用集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14405693/

相关文章:

node.js - 如何将连接中间件与 Node.js Express 4 一起使用?

node.js - Phusion Passenger 上的 Express.js 应用程序 - 未及时编写启动响应

javascript - 咕噜 Jade 编译

javascript - 如何在特定的快速路线上设置不同的bodyparser

javascript - 如何在模块中填充集合以在事件/命令内使用

node.js - 在 Node.js SOAP 客户端中设置授权

angularjs - 将动态生成的 pdf 从 aws-lambda 上传到 aws-s3

javascript - 为什么settimeout会破坏Expressjs

node.js - 如何在 Mongoose 查询中使用 if 语句?

node.js - passport.deserializeUser 为每个 HTTP 请求执行 DB( Sequelize )命令