我有一个node.js ETL系统,它可以通过使用 封号. 突然间,我开始看到随机超时错误,而插入记录到数据库。
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线程池耗尽线程所致。我认为这里的情况不是这样,因为我是以串联方式插入行,而不是并行方式。
一般来说,建议增加 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个连接总是繁忙的。