【问题标题】:Using Sequelize with RDS getting TimeoutError: ResourceRequest timed out使用带有 RDS 的 Sequelize 获取 TimeoutError:ResourceRequest 超时
【发布时间】:2020-02-21 22:23:04
【问题描述】:

我有一个 node.js ETL 系统,它使用 sequelize 将数据加载到亚马逊 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 discussion,似乎这通常是由于长时间运行并行查询导致sequelize线程池耗尽线程。我认为这里不是这种情况,因为我是按顺序插入行,而不是并行插入。

一般建议是增加 sequelize 的 acquire 设置,该设置决定等待多少毫秒以查看池中的另一个线程是否打开以服务请求。 My 当前设置为 30,000,这似乎是一个非常大的值。比 RDS 向表中插入 1 行所需的时间要长得多。

这是我的配置:

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

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

【问题讨论】:

    标签: node.js sequelize.js amazon-rds


    【解决方案1】:

    1) 检查您现有的连接:

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

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

    3) 有时您会遇到耗时超过 1 分钟的慢查询或错误查询,例如事务已启动但从未结束。在这种情况下,1 个连接始终处于忙碌状态。

    【讨论】:

      猜你喜欢
      • 2017-07-05
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      • 2018-10-18
      • 2022-11-08
      相关资源
      最近更新 更多