AWS RDS Proxy:Lambda中使用Sequelize连接RDS出现连接节流问题咨询
解决方案
所有调整均为配置层面修改,无需改动现有嵌套查询的业务逻辑。
1. 修正Sequelize连接池配置与初始化逻辑
你之前注释了连接池配置,且参数不符合Lambda+RDS Proxy的使用场景,调整规则如下:
- Lambda单实例同一时间仅处理1个请求,连接池
max必须设为1,无需多余连接 min设为0,避免无请求时长时间占用代理连接evict时间设为14分钟(早于IAM令牌15分钟的有效期),避免使用过期令牌重连- 把Sequelize实例的初始化移到全局作用域,复用Lambda执行上下文的同一个连接对象,不要每次函数调用都新建实例
2. 调整RDS Proxy侧配置
这是降低后端连接数的核心配置:
- 连接池复用模式改为事务级:只要你的业务没有使用会话级状态(比如临时表、session级别的SET参数),事务级模式下代理会在数据库事务结束后,自动把后端DB连接回收给公共池复用,不需要你主动关闭Lambda侧的连接,就能大幅降低后端连接占用
- 把代理的空闲连接超时设置为30~60秒,自动回收长时间闲置的后端连接
- 可根据业务情况调低代理的最大连接百分比,避免占满数据库的连接上限
调整后的代码示例
const { Sequelize } = require('sequelize'); // 全局存储sequelize实例与令牌信息,复用Lambda执行上下文 let sequelize_connection = null; let proxyToken = null; let tokenGenerateTime = 0; const TOKEN_VALIDITY = 15 * 60 * 1000 - 60 * 1000; // 令牌有效期留1分钟余量 function generateProxyToken() { // 你原来生成IAM令牌的逻辑 return '***latest iam token***'; } function getSequelizeInstance() { // 令牌快过期或实例不存在时才重建 if (!sequelize_connection || Date.now() - tokenGenerateTime > TOKEN_VALIDITY) { proxyToken = generateProxyToken(); tokenGenerateTime = Date.now(); const additionalConnectionDetails = { host: process.env.PROXY_ENDPOINT, schema: 'schemaname', searchPath: 'searchpath', dialect: 'postgres', dialectOptions: { prependSearchPath: true, ssl: { require: true, rejectUnauthorized: false } }, pool: { max: 1, min: 0, acquire: 3000, idle: 1000, evict: 840000 // 14分钟 } } sequelize_connection = new Sequelize(dbCreds.app, dbCreds.userName, proxyToken, additionalConnectionDetails); } return sequelize_connection; } // 业务handler里直接调用getSequelizeInstance()获取连接即可
调整后10QPS的场景下,后端连接数可稳定维持在20以内,无需主动关闭连接。
内容的提问来源于stack exchange,提问作者neeraj mdas
相关产品推荐
相关产品推荐

