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

Should I pool db connections or create new connection per cluster?

我在多个进程上有一个 Node.js 应用程序 运行,我想知道我是否应该合并我的 MongoDB(使用 mongoose)连接我们应该创建一个新连接对于每个集群叉。

这是一个例子:

我应该像这样为每个分支创建一个新的数据库连接吗:

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)
}

在第二种情况下,您的代码没有共享公共池,您只是分别为主进程和每个工作进程创建池。无法在您的集群中共享单个 MongoDB 客户端连接池。

因此,假设您实际上并未在主进程中使用 mongoose,最好只在工作进程中调用 mongoose.connect,就像您在第一种情况下一样,池的大小随您的需要而定每个进程。

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