diff --git a/api/server.js b/api/server.js index 0b7490c..73244bd 100644 --- a/api/server.js +++ b/api/server.js @@ -16,6 +16,12 @@ const cors = require('cors'); const mongoose = require('mongoose'); const {exec} = require('child_process'); +// cluster mode +const cluster = require('cluster'); +const envWorkerNum = process.env.NODE_WORKER_COUNT; +const cpuCount = require('os').cpus().length; +const numWorkers = (envWorkerNum && envWorkerNum < cpuCount) ? envWorkerNum : cpuCount; + // own modules const config = require('./config/config'); const urls = require('./config/api-url'); @@ -108,7 +114,7 @@ if (process.env.NODE_ENV === config.test.unit.env || process.env.NODE_ENV === co const mongoServer = new MongodbMemoryServer(); mongoose.Promise = Promise; mongoServer.getConnectionString().then((mongoUri) => { - mongoose.connect(mongoUri); + mongoose.connect(mongoUri, { useNewUrlParser: true }); mongoose.connection.on('error', (e) => { if (e.message.code === 'ETIMEDOUT') { @@ -139,17 +145,29 @@ if (process.env.NODE_ENV === config.test.unit.env || process.env.NODE_ENV === co }); }); } else { - const mongoosePromise = mongoose.connect(config.database.uri + config.database.db); - mongoosePromise.then((db) => { - app.listen(config.port, (err) => { - if (err !== undefined) { - error('Error on startup, ', err); - } else { - logger('Listening on port ' + config.port); - signatureCronJob.start(); - backupCronJob.start(); + mongoose.connect(config.database.uri + config.database.db, {useNewUrlParser: true}).then((db) => { + if (cluster.isMaster) { + // Fork workers + for (let i = 0; i < numWorkers; i++) { + cluster.fork(); } - }); + logger(`Master ${process.pid} is running. Forking ${numWorkers} workers`); + + //Check if worker id is died + cluster.on('exit', (worker, code, signal) => { + logger(`worker ${worker.process.pid} died`); + }); + } else { + app.listen(config.port, (err) => { + if (err !== undefined) { + error(`Error on startup ${err}`); + } else { + logger(`Worker ${process.pid} started. Listening on port ${config.port}`); + signatureCronJob.start(); + backupCronJob.start(); + } + }); + } }); }