使用Sequelize获取超时错误:ResourceRequest超时



我有一个node.js ETL系统,它使用sequelize将数据加载到amazon RDS PostgreSQL实例中。突然间,在将记录插入数据库时,我开始看到随机超时错误:

TimeoutError: ResourceRequest timed out
at ResourceRequest._fireTimeout (/home/ubuntu/myproject/etl/node_modules/generic-pool/lib/ResourceRequest.js:62:17)
at Timeout.bound (/home/ubuntu/myproject/etl/node_modules/generic-pool/lib/ResourceRequest.js:8:15)
at ontimeout (timers.js:482:11)
at tryOnTimeout (timers.js:317:5)
at Timer.listOnTimeout (timers.js:277:5)

RDS盒子相当结实(db.t2.large(,自从一年多前开始运行以来,这一直不是问题。

基于对sequelize的讨论,这似乎通常是由于长时间运行的并行查询导致sequealize线程池耗尽线程。我不认为这里的情况是这样的,因为我插入的行是串行的,而不是并行的。

通常,建议是增加sequelize的acquire设置,该设置确定等待池中的另一个线程是否打开来为请求提供服务的毫秒数。我的当前设置为30000,这似乎是一个非常大的值。RDS在一个表中插入1行所需的时间要长得多。

这是我的配置:

pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
}

这只是ec2和RDS之间的网络连接问题吗?这似乎是一个不同的错误。

1(检查现有连接:

SELECT client_addr, count(*) FROM pg_stat_activity WHERE datname = 'YOUR_DB_NAME' GROUP BY client_addr;

2( 您可以增加最大池大小。

3( 有时您会遇到耗时超过1分钟的慢速查询,或者错误的查询,如事务已启动但从未结束。在这种情况下,1个连接总是繁忙的。

最新更新