Pro*_*fer 6 mongoose mongodb node.js replicaset serverless-framework
我正在使用mongodb和nodejs。我已经在Atlas上托管了mongodb。
我的后端一直运行良好,但是现在有时会卡住,当我在mongodb地图集上看到分析数据时,它显示活动连接的最大数量达到100。
有人可以解释为什么会这样吗?我可以重新启动连接并将其设置为0吗?
@Stennie我用过猫鼬来连接数据库
这是我的配置文件
const mongooseOptions = {
useNewUrlParser: true,
autoReconnect: true,
poolSize: 25,
connectTimeoutMS: 30000,
socketTimeoutMS: 30000
}
exports.register = (server, options, next) => {
defaults = Hoek.applyToDefaults(defaults, options)
if (Mongoose.connection.readyState) {
return next()
}
if (!Mongoose.connection.readyState) {
server.log(`${process.env.NOED_ENV} server connecting to ${defaults.url} ${defaults.url}`)
return Mongoose.connect(defaults.url, mongooseOptions).then(() => {
return next() // call the next item in hapi bootstrap
})
}
}
Run Code Online (Sandbox Code Playgroud)
您可以尝试以下几件事:
在serverless@Gabriel Bleu 已经建议的环境中,为什么有如此高的connectionLimit. Serverless环境不断生成新容器并根据请求停止。如果同时生成多个实例,它将很快耗尽 MongoDB 服务器限制。
其概念connectionPool是,x每个节点(实例)每次都会建立一定数量的连接。但这并不意味着所有连接在查询后都会自动释放。完成所有数据库操作后,您应该release单独使用每个连接:mongoose.connection.close();
注意: Mongoose Connection Close 会关闭连接池的所有连接。因此理想情况下,这应该在返回响应之前运行。
为什么你要显式地设置autoReconnect为true。每当连接丢失时,MongoDB 驱动程序都会在内部serverless containers重新连接,当然不建议用于生命周期较短的实例,例如.
如果您在 模式下运行cluster,为了优化性能,请将serverUri副本集 URL 格式更改为:MONGODB_URI=mongodb://<username>:<password>@<hostOne>,<hostTwo>,<hostThree>...&ssl=true&authSource=admin。
假设由于无服务器标签,您的后端已部署在lambda上。
每次调用都会使一个容器处于空闲状态以防止冷启动,或者使用一个已有的容器(如果有)。您将打开连接以在调用之间重用它,如最佳实践中所宣传的那样。
如果连接数poolSize为25(?),最大连接数为100,则应将函数并发限制为4。
保留并发,以防止您的功能使用该区域中所有可用的并发,或避免过载下游资源。
更多阅读:https : //www.mongodb.com/blog/post/optimizing-aws-lambda-performance-with-mongodb-atlas-and-nodejs
影响的因素实在是太多了max connection limit。您已mongoDB在 Atlas 上托管,正如您所提到的,后端lamda意味着您拥有无服务器环境。
peak显示有太多新实例正在初始化或来自用户连接的并发请求太多。最佳实践是在不再需要数据库连接时终止它。mongoose.connection.close();您可以按照您使用过的方式终止连接\nmongoose。它将从连接池中释放连接。您应该在连接空闲后释放连接,而不是耗尽并发连接限制。autoReconnectas true,以便一旦连接断开,驱动程序将快速实例化连接请求。这可能会影响concurrent connection limit. 您应该避免明确设置它。cluster mode可以根据负载优化请求,可以将服务器uri更改为数据库的副本。它可能有助于迁移负载。mongos分片集群比连接到副本集更快。在 Lambda 函数的生命周期内,后续连接的速度将显着加快。因此每次调用都会使容器空闲以防止cold start或cold boot,或者使用现有的容器(如果可用)。restart应用程序。为了防止将来出现此问题,请考虑使用 maxPoolSize 连接字符串选项来限制连接池中的连接数。| 归档时间: |
|
| 查看次数: |
588 次 |
| 最近记录: |