next.js 和 mongodb atlas - 收到 "Connections % of configured limit has gone above 80" 警报
next.js and mongodb atlas - getting "Connections % of configured limit has gone above 80" alert
我在 MongoDB Atlas ("Connections % of configured limit has gone above 80") 上看到了很多关于此警报的帖子和文章,但无法弄清楚如何在我的 Next.js 应用程序中解决它。
我在处理函数之外创建了我的数据库连接。我使用了中间件 withDatabase.js
:
const client = new MongoClient(process.env.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true
});
const addDbToRequest = (handler, req, res) => {
req.db = req.connection.db("MYDBNAME");
return handler(req, res);
};
const withDatabase = handler => async (req, res) => {
if (!client.isConnected()) {
await client.connect();
}
req.connection = client;
return addDbToRequest(handler, req, res);
};
export default withDatabase;
此中间件包装 API 端点处理程序。
现在,如果我在每个 API 处理程序完成时关闭连接,如下所示:
const { connection } = req;
if (connection) {
connection.close();
}
然后,我在对同一个 api 处理程序的第二个请求中遇到错误:
MongoError: Topology is closed, please connect
如果我没有关闭连接,我会在我的电子邮件中收到此警报(在短时间使用后):
Connections % of configured limit has gone above 80
在 Next.js 应用程序中使用 MongoDB Atlas 的最佳做法是什么?
谢谢!
由于以下原因应重新使用该连接:
- 在每个 API 请求上打开和关闭数据库连接很慢。
- 它很难扩展。假设您同时为每个用户发出几个 API 请求,当应用获得更多用户时,您将很快达到相同的连接限制。
How do I manage MongoDB connections in a Node.js web application?
默认 MongoClient
配置将每个池 (poolSize
) 的最大连接数设置为 5
。因此,如果您只有一个应用程序实例 运行 并像您一样检查客户端是否已连接,您在 MongoDB Atlas 中不应该看到超过 5 个连接。
if (!client.isConnected()) {
await client.connect();
}
请注意,在开发模式 (next dev
) 中的每个请求上 Next.js "restarts" 似乎会影响 MongoClient
缓存并创建许多连接。但是在生产模式下,您应该不会遇到这个问题。
为了修复 Next 开发模式下达到的最大连接数问题,我发现将 reused/cached client
对象写入全局节点对象允许它在刷新之间持续存在。
const MongoClient = require('mongodb').MongoClient;
async function useMongoClient() {
if (!this.client) {
this.client = await MongoClient.connect(process.env.MONGODB_URI, {
useUnifiedTopology: true,
});
}
return this.client;
}
module.exports = useMongoClient;
我在 MongoDB Atlas ("Connections % of configured limit has gone above 80") 上看到了很多关于此警报的帖子和文章,但无法弄清楚如何在我的 Next.js 应用程序中解决它。
我在处理函数之外创建了我的数据库连接。我使用了中间件 withDatabase.js
:
const client = new MongoClient(process.env.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true
});
const addDbToRequest = (handler, req, res) => {
req.db = req.connection.db("MYDBNAME");
return handler(req, res);
};
const withDatabase = handler => async (req, res) => {
if (!client.isConnected()) {
await client.connect();
}
req.connection = client;
return addDbToRequest(handler, req, res);
};
export default withDatabase;
此中间件包装 API 端点处理程序。
现在,如果我在每个 API 处理程序完成时关闭连接,如下所示:
const { connection } = req;
if (connection) {
connection.close();
}
然后,我在对同一个 api 处理程序的第二个请求中遇到错误:
MongoError: Topology is closed, please connect
如果我没有关闭连接,我会在我的电子邮件中收到此警报(在短时间使用后):
Connections % of configured limit has gone above 80
在 Next.js 应用程序中使用 MongoDB Atlas 的最佳做法是什么?
谢谢!
由于以下原因应重新使用该连接:
- 在每个 API 请求上打开和关闭数据库连接很慢。
- 它很难扩展。假设您同时为每个用户发出几个 API 请求,当应用获得更多用户时,您将很快达到相同的连接限制。
How do I manage MongoDB connections in a Node.js web application?
默认 MongoClient
配置将每个池 (poolSize
) 的最大连接数设置为 5
。因此,如果您只有一个应用程序实例 运行 并像您一样检查客户端是否已连接,您在 MongoDB Atlas 中不应该看到超过 5 个连接。
if (!client.isConnected()) {
await client.connect();
}
请注意,在开发模式 (next dev
) 中的每个请求上 Next.js "restarts" 似乎会影响 MongoClient
缓存并创建许多连接。但是在生产模式下,您应该不会遇到这个问题。
为了修复 Next 开发模式下达到的最大连接数问题,我发现将 reused/cached client
对象写入全局节点对象允许它在刷新之间持续存在。
const MongoClient = require('mongodb').MongoClient;
async function useMongoClient() {
if (!this.client) {
this.client = await MongoClient.connect(process.env.MONGODB_URI, {
useUnifiedTopology: true,
});
}
return this.client;
}
module.exports = useMongoClient;