私は私のウェブサーバとして+ express
node
を使用して、そして4 workers
のcluster
を持っています。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秒を検証しようとします。
返信いただきありがとうございます。編集部分にルート全体を投稿しました。 –
あなたはそうです、 'require'行でサーバが起動しています。 elseステートメントに移動することで問題が解決されます。 –