使用 Serverless Aurora 时 Sequelize 连接超时,寻找增加超时持续时间或重试连接的方法
Posted
技术标签:
【中文标题】使用 Serverless Aurora 时 Sequelize 连接超时,寻找增加超时持续时间或重试连接的方法【英文标题】:Sequelize connection timeout while using Serverless Aurora, looking for a way to increase timeout duration or retry connection 【发布时间】:2019-02-27 03:36:51 【问题描述】:我在尝试将无服务器 Aurora 数据库用作我的应用程序的一部分时遇到了问题。
问题本质上是当数据库冷时,建立连接的时间可能大于 30 秒(由于 db spinup) - 这似乎比 Sequelize 中的默认超时时间更长(使用 mysql),并且作为据我所知,我找不到任何其他方法来增加此超时时间,或者我可能需要某种方式重新尝试连接?
这是我当前的配置:
const sequelize = new Sequelize(DATABASE, DB_USER, DB_PASSWORD,
host: DB_ENDPOINT,
dialect: "mysql",
operatorsAliases: false,
pool:
max: 2,
min: 0,
acquire: 120000, // This needs to be fairly high to account for a
serverless db spinup
idle: 120000,
evict: 120000
);
几个额外的点: 一旦数据库变热,那么一切都会完美运行。 保持数据库“热”,虽然它在技术上可以工作,但有点违背了将其作为无服务器数据库的意义(成本原因)。 如果超时是连接错误,我愿意让我的客户端重新尝试 API 调用。
这是日志,以防万一他们有帮助。
"name": "SequelizeConnectionError",
"parent":
"errorno": "ETIMEDOUT",
"code": "ETIMEDOUT",
"syscall": "connect",
"fatal": true
,
"original":
"errorno": "ETIMEDOUT",
"code": "ETIMEDOUT",
"syscall": "connect",
"fatal": true
【问题讨论】:
这是从哪里来的? " acquire: 120000, // 这需要相当高才能考虑无服务器数据库启动"。你能指出我的文档吗?我们目前使用以下选项: pool: max: MAX_MYSQL_POOL_CONNECTIONS, min: 0, acquire: 20000, idle: 3000, evict: 1500, retry: max: 5, backoffBase: 1000, // 初始退避持续时间,以毫秒为单位。默认值:100,backoffExponent:1.5,//每次尝试增加退避的指数。默认值:1.1 【参考方案1】:因此,经过进一步挖掘,您似乎可以使用 options 对象上的 dialectOptions 属性将内容传递给底层连接。
dialectOptions:
connectTimeout: 60000
这似乎在起作用。
【讨论】:
非常感谢您发布自己的解决方案!很有用! npmjs.com/package/mysql#connection-options 感谢您发布此信息。你还在使用连接池吗?还是您禁用了它并且只有这个 connectTimeout 参数?以上是关于使用 Serverless Aurora 时 Sequelize 连接超时,寻找增加超时持续时间或重试连接的方法的主要内容,如果未能解决你的问题,请参考以下文章
使用 HikariCP 和 AWS Aurora Serverless 的连接池配置
使用 CloudFormation(和 Lambda 轮换模板)的 Aurora Serverless 密码轮换设置
AWS Aurora Serverless RdsDataClient unicode 问题