gpt4 book ai didi

mongodb - Vercel 为每个请求创建新的数据库连接

转载 作者:行者123 更新时间:2023-12-04 01:16:55 29 4
gpt4 key购买 nike

我正在开发一个新网站,虽然我们在本地开发时一切正常,但当我们尝试在 Vercel 上部署时遇到了问题。该应用程序为页面和 API 使用 Sapper 框架,以及我们通过 Mongoose 访问的 MongoDB Atlas 中的数据库。我们在本地的行为是我们 npm run dev并且建立了一个数据库连接,该连接一直持续到我们关闭应用程序。
Local logs
但是,当它部署到 Vercel 时,建立数据库连接并打印“数据库连接成功”消息并且只应该运行一次的代码会在每个 API 请求上运行
New DB connection per request
这似乎很快就失控了,达到了我们数据库 500 个连接的限制:
DB connections hits limit
结果,在网站被一个用户短暂使用后,我们的一些 API 请求开始失败并出现此错误(我们让 db 接受任何连接而不是 IP 白名单,因此错误给出的建议没有帮助) :
API can't connect to DB
我们的实现是调用 mongoose.connect在 .js 文件中:

mongoose.connect(DB, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
}).then(() => console.log("DB connection successful!")).catch(console.error);
然后我们 import该文件在 Sapper 的 server.js .我们能够找到的建议是“只缓存连接”,但这并没有成功,而且似乎更像是 node-mongodb-native事物。无论如何,这是我们尝试过的方法,它在本地没有更好或更糟,但也没有解决 Vercel 上的问题:
let cachedDb = {};

exports.connection = async () => {
if (cachedDb.isConnected)
return;
try {
const db = await mongoose.connect(DB, {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
});
cachedDb.isConnected = db.connections[0].readyState;
console.log("DB connection successful!");
return cachedDb;
} catch(error) {console.log("Couldn't connect to DB", error);}
那么......有没有一种方法可以在不更换至少一个部件的情况下完成这项工作?该网站尚未上线,因此更换某些内容并不是世界末日,但“仅更改设置”绝对比从头开始更受欢迎。

最佳答案

概括
Vercel 上的无服务器功能就像一个独立的过程一样工作。虽然可以“按功能”缓存连接,但将 serverful-ready 库部署到无服务器环境并不是一个好主意。以下是您需要回答的几个问题:

  • 您的框架或数据库库是否缓存了连接?
  • 您的代码是否为 Serverless 做好了准备?
  • Vercel 针对什么类型的工作负载进行了优化?

  • 进一步的背景
    Vercel 是一个出色的前端平台,可以使用 Serverless Functions 作为助手。 CDN 与工作流结合使用,使部署过程非常快速,并使您的行动更快。部署成熟的 API 或服务器负载永远不是一个好主意。假设我需要在 Vercel 中使用 MySQL。而不是 mysql , 你应该使用 mysql-serverless ,它针对无服务器原语进行了优化。即使考虑到这一点,根据您期望的请求级别,仅将 VM/容器用于 API 可能会更便宜。因此,我们最终会得到以下理想的解决方案:
    Frontend (Vercel - Serverless) --> Backend (Serverful - External provider) --> DB
    免责声明:目前,我为 Vercel 工作。

    关于mongodb - Vercel 为每个请求创建新的数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63208960/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com