AWS Lambda, NodeJS, pg-библиотека обещаний — Высокая задержка > 10000 мс

#node.js #postgresql #amazon-web-services #pg-promise

Вопрос:

У меня есть настройка функции AWS Lambda с использованием NodeJS, которая вызывает базу данных postgres с использованием библиотеки pg-promise для извлечения данных, которая затем отправляет запросы на получение HTTPS и т. Д., Но все остальное не важно.

Я изначально использовал библиотеку «pg», но столкнулся с проблемами с закрытием соединения и асинхронностью, поэтому я переключился на pg-promise (что исправило мою другую проблему!). С обычной библиотекой pg я ожидал задержки

Я сократил и отредактировал код до простого запроса, и я получаю это время отклика от последних 3 тестовых запусков: 11790,78 мс, 11232,22 мс, 12002,04 мс. Каждый раз это превышает 10000мс…

ИЗМЕНИТЬ: Исправлен код

 const pgp = require('pg-promise')();
const https = require('https');
const xmlParser = require('xml2js').Parser();

const client = pgp({
    database: process.env.DATABASE,
    host: process.env.HOST,
    port: process.env.PORT,
    user: process.env.USERNAME,
    password: process.env.PASSWORD
});

exports.handler = function(event, context, callback) {  
    client.one("SELECT period FROM pay WHERE company='XXX' ORDER BY moddate DESC LIMIT 1;")
        .then(function(data) {
            callback(null, {
                "statusCode": 200,
                "headers": {
                    'Content-Type' : 'application/json'
                },
                "body": data.period
            });
        })
        .catch(function(error) {
            console.error(error);
        });
};
 

Как уже говорилось, у меня не было проблем с задержкой при использовании библиотеки «pg», поэтому я знаю, что с подключением lambda-RDS postgres проблем нет.

У кого-нибудь есть какие-нибудь идеи, почему это так?

Спасибо,

Комментарии:

1. Я хотел бы знать, не могли бы вы попробовать позвонить в connect directly…it было бы интересно узнать, является ли это открытием соединения или фактическим запросом, который занимает так много времени. Также не следует ли вам callback либо быть внутри вашего .then …или, может быть, переключиться на await выполнение обещания? Прямо сейчас вы собираетесь выполнить callback свое обещание до того, как оно будет выполнено…не уверен, какой эффект это окажет на Лямбду.

2. См. Пример асинхронности для написания этого кода с использованием обещаний. Или перепишите его так, чтобы обработчик не был асинхронным, а обратный вызов выполнялся в обработчиках then и. catch В настоящее время код неверен ни для одного из сценариев (асинхронный или обратный вызов).

3. @David784 спасибо. Я обновил приведенный пример кода, чтобы отразить правильную обработку обратного вызова. Однако проблема все еще сохраняется. Я собираюсь провести рекомендованный вами тест на подключение и посмотреть, каковы будут результаты

4. @jarmod спасибо, я обновил код, однако проблема все еще сохраняется

Ответ №1:

В конце концов я понял, в чем была проблема… оставив pg-обещание автоматически отключить пул соединений, это то, что вызвало задержку.

Приковывание а

 .finally(pgp.end);
 

после того, как .catch дал мне время отклика 200 мс.

Спасибо всем

Комментарии:

1. Это не просто закрытие соединения. Это закрывает все соединения в пуле, а затем отключает пул, чтобы его больше нельзя было использовать. Это не может быть хорошим решением вашей проблемы, скорее это неприятный хак. Любые запросы, выполняемые параллельно, также погибнут.

2. @vitaly-t какой тогда был бы правильный подход к этому вопросу? Я сталкиваюсь с проблемой сейчас, когда заново внедряю остальную логику. После извлечения этих данных он запускает другой запрос, чтобы получить идентификатор пользователя, который он выполняет циклически — отправляет запрос GET, а затем записывает эти ответы обратно в базу данных. Как вы можете себе представить, сейчас я сталкиваюсь с проблемами с закрытием соединения при попытке выполнить запись в базу данных в последний раз (внутри цикла)… Спасибо, сэр

3. Лямбда, как известно, является наиболее проблемной системой, когда дело доходит до соединений. Он применяет самую агрессивную политику закрытия соединений. Это создает ряд проблем. Поэтому было зарегистрировано много проблем, связанных с лямбда- зависимостью. Я бы предложил взглянуть на них. Я не могу быть более конкретным, и я сам не использую Лямбду.

4. @виталий-т спасибо тебе… В конце концов мне удалось решить эту проблему, обработав половину запроса и лямбду, а также окончательную обратную запись в базу данных самим приложением… Я использую .finally(pgp.end) в качестве цепочки после финала . затем решает, так что я не думаю, что это будет считаться «халтурным» ?