如何在mySQL池集群中使用nodeJS集群?

快速的问题

如果我使用4个工人(4个应用程序)创build节点集群应用程序,我应该使用mySQL池还是使用mysql池集群? 如果我使用池,它将为每个应用程序创build一个池,但如果使用池群集,则会为每个应用程序创build4个池(共16个池)。 这是一个很好的实现,还是会降低性能?

举一个假的例子来说明我在问什么。 我正在创build一个像这样的nodeJS服务器应用程序。


首先,让我们为mysql数据库创buildconfiguration文件(重要的是我创builddb worker的这个文件的最后一部分):

DBconfig.js

'use strict' const mysql = require('mysql'), workers = process.env.WORKERS || require('os').cpus().length, cluster = require('cluster'); //Local Database Settings const local_settings = { user : 'user', host : '127.0.0.1', password : 'pass', database : 'dbname', debug : false, dateStrings: true, connectionLimit : 10, defaultSelector : 'RR', multipleStatements : true, removeNodeErrorCount: 1 }; let poolCluster = module.exports = mysql.createPoolCluster( local_settings ); //here I make one db worker for each app worker for(let i = 0; i < workers; i++){ poolCluster.add(`DBWORKER_${process.pid}_${i}`, local_settings); } 

然后我创build一个全局的库,在我的数据库连接函数的应用程序中使用

globalLib.js

 'use strict' const path = require('path'), poolCluster = require(path.join('path','to_the','DBconfig.js')); global.db = obj => { return new Promise( (resolve, reject) => { poolCluster.getConnection(function(err, connection){ if(err) {reject(err);return} connection.query(obj.query, obj.params, function(){ connection.release(); if(!err) resolve(rows) else reject(err); }); connection.on('error'), function(err){ reject(err); }); } }) } 

app.js

 'use strict' const express = require('express'), path = require('path'); let app = module.exports = express(); //here I handle all with express.Router() const index = require(path.join('path','to_my','index.js')); app.use('/', index) 

最后我有一个从我启动服务器的集群文件(这里的一切都很重要):

cluster.js

 'use strict' const path = require('path'), cluster = require('cluster'), sockets = require(path.join('path_to','sockets.js')), app = require(path.join('path_to','app.js')), pclust = require(path.join('path_to', 'DBconfig.js')), workers = process.env.WORKERS || require('os').cpus().length; if (cluster.isMaster) { for (var i = 0; i < workers; ++i) { var worker = cluster.fork(); } cluster.on('disconnect', function(worker) { pclust.remove(`DBWORKER_${worker.process.pid}_*`);//remove all connections relative to this process pid var worker = cluster.fork(); }); } else { //Start Application var server = app.listen(8080, '127.0.0.1', function(){ console.log('yeeeeey'); }); // initialize socket sockets.initialize(server,app); } 

假设我有4个cpus,所以会有4个我的app.js实例。 因此,我在每个应用程序中为每个cpu创build了4个数据库工作者,所以最后我有:

 cpuID server instances db workers 1 1 4 2 1 4 3 1 4 4 1 4 4 4 16 ( TOTAL ) 

所以,我留下了很多数据库工作人员…问题是,这是一个很好的实施nodeJS集群和MySQL池集群? 如果不是这是正确的方式?