Вызов лямбда-лямбда 22 раза одновременно занимает слишком много времени

Я вызываю lambda_B 22 раза (асинхронно) из lambda_A, один вызов lambda_B завершает выполнение за 3 секунды, поэтому, согласно этому, когда я вызываю 22 лямбда асинхронно, это должно занять время около 3 секунд. Но это занимает время 16-20 сек.

Вот пример кода, который я использую

async callingLambda(arrayvalue) {
  try {
    const lambdaResponse = await BPromise.all(
      arrayvalue.map((leg) => {
        return new BPromise((resolve, reject) => {
          const FunctionName = 'Lambda_B';
          lambda.invoke({
            FunctionName: FunctionName,
            InvocationType: 'RequestResponse',
            LogType: 'Tail',
            Payload: JSON.stringify(reqParmaters)
          }, function(error, data) {
            if (error) {
              reject(error);
            } else {
              resolve(body.errors.length ? null : body.data);
            }
          });
        });
      })
    );
    return lambdaResponse;
  } catch (error) {
    return BPromise.reject(error);
  }
}

Я сделал несколько замечаний: если я уменьшу количество звонков до 4-6, это займет около 3 секунд, но когда я увеличу количество звонков, время также увеличится.

Согласно моим исследованиям, эта проблема может возникнуть из-за того, что нет. операций ввода-вывода, обрабатываемых nodejs параллельно, равно UV_THREADPOOL_SIZE, а значение по умолчанию UV_THREADPOOL_SIZE равно 4.

Я также увеличил размер UV_THREADPOOL_SIZE, но это не работает.


person Aabid    schedule 07.09.2018    source источник
comment
Следует отметить, что чрезвычайно маловероятно, что это займет 3 секунды, даже в лучшем случае. Ваш компьютер, скорее всего, не сможет запускать их все одновременно, а даже если и сможет, то, скорее всего, не сможет. 16 секунд вполне достаточно для задачи, которая при последовательном выполнении заняла бы больше минуты.   -  person Carcigenicate    schedule 07.09.2018
comment
@Carcigenicate на вашем компьютере не выполняются функции Lambda.   -  person Michael - sqlbot    schedule 08.09.2018
comment
Ваш компьютер запускает лямбда-функции при локальном вызове, то есть при тестировании. Интересно, это как-то связано со временем холодного запуска лямбд?   -  person Brian McCall    schedule 09.09.2018
comment
@BrianMcCall Я рассмотрел случай холодного запуска, но мои лямбда-выражения находятся в состоянии прогрева.   -  person Aabid    schedule 10.09.2018
comment
@Aabid Не могли бы вы проверить кластер, который может вам помочь https://stackoverflow.com/questions/43213250/nodejs-cluster-on-aws-lambda   -  person IftekharDani    schedule 11.09.2018


Ответы (1)


У вас есть проблема в параметрах вашего вызывающего процесса. Ссылка на AWS: документы Lambda для асинхронного вызова, который вы должны установить

InvocationType: 'Event'

Вместо:

InvocationType: 'RequestResponse'

Взгляните на https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

person Nikolay Vetrov    schedule 14.09.2018
comment
В Event вы не получите ответ Lambda_B, и мне нужно тело ответа. - person Aabid; 16.09.2018
comment
Я имею в виду, что вы пытаетесь выполнить асинхронный запрос, и вам нужно изменить тип вызова. - person Nikolay Vetrov; 17.09.2018