AWS Lambda使用Mongoose连接MongoDB时连接数超限及异常命令问题求助
MongoDB command与query的定义及区别
- query:仅指向集合发起的数据读请求,对应
find、findOne等直接获取业务数据的操作,属于command的子集。 - command:是MongoDB所有数据库操作的统一上层封装,除业务读写请求外,还覆盖连接握手、权限校验、探活、索引管理、实例状态查询、事务控制等所有系统类操作。你观测到command数量远高于query,核心来源是你代码中每次连接校验时触发的
ping操作,以及新连接建立过程中的握手、鉴权等系统操作。
大量command引发连接数超限的推论判定
该推论不成立。你观测到的command上涨与连接数同步上涨是同一根因产生的伴生现象,不存在因果关系:
高并发场景下大量新连接被创建,每一个新连接的建立、探活过程都会产生多个command,因此两者的监控曲线会同步上涨,command上涨是连接数上涨的结果,而非原因。
你当前连接复用逻辑的核心缺陷
你实现的类单例模式未处理并发竞态问题:当单个Lambda实例同时接收到多个请求,且现有连接未完成初始化时,多个请求会同时通过checkConnection的校验,触发多次mongoose.connect调用,导致单个Lambda实例创建多个连接,违背了单例模式的设计预期,这是你连接数异常上涨的核心原因。
你可以对init方法加进程内锁,避免并发场景下重复创建连接,同时可以移除每次调用init都执行的ping探活逻辑,减少无效command开销。
Lambda环境MongoDB连接池设置建议
AWS Lambda为单并发执行模型,单个Lambda实例同一时间仅会处理1个请求,因此单个Lambda实例的连接池大小设置为1即可,无需配置更高数值。
总连接数可通过以下公式估算管控:
总连接数 = 单实例连接池大小 * Lambda最大并发数
你可以根据MongoDB Atlas的500连接上限,将Lambda最大并发数调整为450以内,预留50个连接位给Atlas的内部管理操作,即可避免连接数超限问题。
内容的提问来源于stack exchange,提问作者William Caetano
相关产品推荐
相关产品推荐

