我应该汇集数据库连接还是为每个集群创建新连接?

时间:2015-03-05 19:50:19

标签: node.js mongodb mongoose

我有一个在多个进程上运行的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)
}

1 个答案:

答案 0 :(得分:2)

您的代码在第二种情况下不共享公共池,您只需为主服务器和每个工作进程单独创建池。没有办法在群集中共享单个MongoDB客户端连接池。

因此,假设您实际上并未在主进程中使用mongoose,那么最好只在工作进程中调用mongoose.connect,就像您在第一种情况下一样,但是池大小却是你想要每个过程。

另请注意,poolSize默认为5,因此,即使您未包含poolSize选项,mongoose.connect仍会创建连接池。