2017-02-08 4 views
0

私は私のウェブサーバとして+ expressnodeを使用して、そして4 workersclusterを持っています。node.jsマルチスレッド - すべてのワーカーが着信要求に応答する理由は何ですか?

問題は、着信要求がすべてのワーカーによって実際に応答されることです。各ワーカーが現在のworkerのプロセスIDをログに記録するAPIを持つ同じWebアプリケーションを提供しているとします。このAPIにアクセスするためにブラウザを使用すると、すべてのワーカーのプロセスIDがログに記録されます。ここで

expressサーバーの index.jsで、 cluster部分のコードです:コントローラは、ユーザーがボタンをクリックしたときのは言わせて、そこですが、アプリのルートで、

if (cluster.isMaster) { 
    console.log(`Master cluster setting up ${numWorkers} workers...`); 

    for (let i = 0; i < numWorkers; i++) { 
    cluster.fork(); 
    } 
} else { 
    // webpack configs... 

    app.get('/test_connection', (req, res) => res.send('ok')); 
    app.use('/js', express.static(`${__dirname}/assets/js`)); 
    app.get('*', (req, res) => { 
    res.sendFile(path.join(__dirname, '..', 'app', 'index.html')); 
    }); 
    app.listen(3000); 
} 

そして、ウェブは、いくつかのページにリダイレクトそれはで、現在のプロセスIDをログアウトするcontrollerをトリガー:

// inside the controller 
console.log(`Connected via ${process.pid}`); 

ユーザーは、そのボタンをクリックし、すべての4労働者のプロセスIDがログアウトしてしまったが判明したときに奇妙なことが、あります。着信要求に応答するのは一人のIDだけではいけませんか?アプリは、コントローラのものを含むルートの設定を、持っていますconst app = require('./config/express')線で

const express = require('express'); 
const path = require('path'); 
const mongoose = require('mongoose'); 
mongoose.Promise = require('bluebird'); 
const webpack = require('webpack'); 
const webpackDevMiddleware = require('webpack-dev-middleware'); 
const webpackHotMiddleware = require('webpack-hot-middleware'); 
const webpackDevConfig = require('../webpack/webpack.config.dev'); 

const mongodb = require('./db/mongo/constants'); 
const transactionDB = require('./db/postgres'); 
const config = require('./config/appConfig'); 
const app = require('./config/express'); 
const ENV = require('./config/appConfig').ENV; 
// const compression = require('compression'); 
const cluster = require('cluster'); 
const numWorkers = require('os').cpus().length; 

if (cluster.isMaster) { 
    console.log(`Master cluster setting up ${numWorkers} workers...`); 

    for (let i = 0; i < numWorkers; i++) { 
    cluster.fork(); 
    } 

    cluster.on('online', worker => { 
    console.log(`Worker ${worker.process.pid} is online`); 
    }); 

    cluster.on('exit', (worker, code, signal) => { 
    console.log(`Worker ${worker.process.pid} died with code ${code}, and signal: ${signal}`); 
    console.log('Starting a new worker'); 
    cluster.fork(); 
    }); 
} else { 
    const compiler = webpack(webpackDevConfig); 
    app.use(webpackDevMiddleware(compiler, { 
     noInfo: true, 
     publicPath: webpackDevConfig.output.publicPath, 
    })); 
    app.use(webpackHotMiddleware(compiler)); 

    app.get('/test_connection', (req, res) => res.send('ok')); 
    app.use('/fonts', express.static(`${__dirname}/assets/fonts`)); 
    app.use('/styles', express.static(`${__dirname}/assets/styles`)); 
    app.use('/images', express.static(`${__dirname}/assets/images`)); 
    app.use('/js', express.static(`${__dirname}/assets/js`)); 
    app.get('*', (req, res) => { 
     res.sendFile(path.join(__dirname, '..', 'app', 'index.html')); 
    }); 

    // connect to MongoDB 
    mongoose.connect(mongodb[ENV].db, (err) => { 
    // connect to PostgreSQL 
    transactionDB.sequelize 
     .sync() 
     .then(() => { 
     const server = app.listen(app.get('port')); 
     }); 
    }); 
} 

EDIT:

は、ここに私の全体のサーバーのルートです。

はところで私は socket.io一部をコメントしたが、クライアントはまだそれが重要かどうか知りませんが、トークンごとに3秒を検証しようとします。

答えて

1

あなたは既にサーバーを作成した後にフォークしています。サーバーを作成する前にフォークする必要があります。これは、フォークでは、各プロセスが開いているすべてのファイルを継承し、すべて同じファイルを受信するためです。すべてのコードを配置すれば、移動する必要があることを伝えることができます。

編集:

この行は、あなたのサーバーを起動するものです。あなたがしたいことは、コードのelse(マスターではない)ブランチの内側にあるすべてのものを配置することです。

const app = require('./config/express'); 

本質的に、あなたのマスターコンポーネントは、子供をスピンアップして管理するだけです。また、既存のドロップインを使用してこれを処理することもできます。たとえば、express-cluster。ここを参照してください:https://www.npmjs.com/package/express-cluster

そして最後のノートとして、あなたは、各労働者が別のポートであることを確認したくなるでしょう。そうでない場合、ポート再利用エラーが発生します。だから私は既存のライブラリを使うことを提案していますが、私が働いているところでは、これを自分で書きました。あなた自身がそれをやるべき十分な理由がない限り、すでに存在するものを使用してください。

+0

返信いただきありがとうございます。編集部分にルート全体を投稿しました。 –

+0

あなたはそうです、 'require'行でサーバが起動しています。 elseステートメントに移動することで問題が解決されます。 –

関連する問題