当 运行 Node.js mongoose 应用程序在 Google Cloud 运行 中时 MongoDB 连接过多

Too much MongoDB connections when running Node.js mongoose app in Google Cloud Run

我是 运行 一个 Node.js API 使用 mongoose 连接到 MongoDB Atlas。 Node.js API 在 Google 云 运行 上运行。

我使用 mongoose 打开一个连接

mongoose.connect(mongoUrl);
  const db = mongoose.connection;
  db.on("error", console.error.bind(console, "connection error:"));
  db.once("open", () => {
    console.info("Mongo Database connected");

然后当 SINGINT 信号从 Google 云端 运行

到达时优雅地关闭与数据库的连接
process.on("SIGINT", () => gracefulShutdown(server));

const gracefulShutdown = async (apollo?: ApolloServer) => {
  await mongoose.connection.close();
  console.info(`MONGODB CONNECTION CLOSED!`);
  await apollo.stop();
  console.info(`APOLLO SERVER STOPPED!`);
  process.exit();
};

正如我在日志中看到的那样,它工作正常MONGODB CONNECTION CLOSED!

但是,即使云 运行 实例永远不会超过 5 或 6,与数据库的连接数也会增加到 130。

这里有什么我遗漏的吗?

我想我解开了谜团。根据猫鼬文档

maxPoolSize - The maximum number of sockets the MongoDB driver will keep open for this connection. By default, maxPoolSize is 100. Keep in mind that MongoDB only allows one operation per socket at a time, so you may want to increase this if you find you have a few slow queries that are blocking faster queries from proceeding. See Slow Trains in MongoDB and Node.js. You may want to decrease maxPoolSize if you are running into connection limits

我使用 Apollo graphql 服务器。当您链接解析器时,它们是 运行 作为承诺,因此,mongoose 可以为一个 API 调用启动多达 100 个连接。如果您查询一组 ID 来构建您的响应对象,就会发生这种情况。

为什么这发生在 Cloud 运行 而不是 GKE 中。因为 Cloud 运行 可以按需快速部署您的服务实例,而在 GKE 上您通常会限制 PODs 的数量。因此,为了响应 5 API 次调用,Cloud 运行 可以并行部署 5 个容器,从而扩展到最多 500 Mongo 个连接,然后关闭实例。使用 GKE 就不会发生这种情况。