У меня есть ETL-система node.js, которая загружает данные в экземпляр Amazon RDS PostgreSQL, используя sequelize . Внезапно я начал видеть случайные ошибки тайм-аута при вставке записей в базу данных:
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
), и это не было проблемой, так как эта вещь началасьработали более года назад.
Исходя из этого последующего обсуждения , кажется, что это обычно происходит из-за того, что в пуле последовательных потоков исчерпаны потоки из-за длительных параллельных запросов. Я не думаю, что это имеет место здесь, потому что я вставляю строки последовательно, а не параллельно.
Обычно совет заключается в том, чтобы увеличить параметр секвелизации acquire
, который определяет, сколько миллисекунд она будет ждать, чтобы увидеть,другой поток в пуле открывается для обслуживания запроса. Мой в настоящее время установлен на 30 000, что кажется очень большим значением. Намного дольше, чем требуется для RDS, чтобы вставить 1 строку в таблицу.
Вот мой конфиг:
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
}
Это просто проблема с сетевым подключением между ec2 и RDS? Похоже, это было бы другой ошибкой.