我有一个在多个进程上运行的Node.js应用程序,我想知道是否应该集合我的MongoDB(使用mongoose)连接,我们应该为每个集群fork创建一个新连接。
以下是一个例子:
我应该为每个分支创建一个新的数据库连接,如下所示:
if (cluster.isMaster) {
var totalCPUs = os.cpus().length;
var forks = 0;
while (forks < totalCPUs) {
cluster.fork();
forks++;
}
cluster.on('exit', function(worker) {
console.error("Cluster worker " + worker.id + " exited unexpectedly.");
return cluster.fork();
});
} else {
mongoose.connect(uri);
...
app = express()
http.createServer(app).listen(8080)
}
或使用poolSize
创建单个连接if (cluster.isMaster) {
var totalCPUs = os.cpus().length;
mongoose.connect(uri, { server: { poolSize: totalCPUs });
var forks = 0;
while (forks < totalCPUs) {
cluster.fork();
forks++;
}
cluster.on('exit', function(worker) {
console.error("Cluster worker " + worker.id + " exited unexpectedly.");
return cluster.fork();
});
}else{
app = express()
http.createServer(app).listen(8080)
}
答案 0 :(得分:2)
您的代码在第二种情况下不共享公共池,您只需为主服务器和每个工作进程单独创建池。没有办法在群集中共享单个MongoDB客户端连接池。
因此,假设您实际上并未在主进程中使用mongoose,那么最好只在工作进程中调用mongoose.connect
,就像您在第一种情况下一样,但是池大小却是你想要每个过程。
另请注意,poolSize
默认为5,因此,即使您未包含poolSize
选项,mongoose.connect
仍会创建连接池。