Лямбды перестают вызывать через некоторое время - PullRequest
0 голосов
/ 27 октября 2018

Вот мои настройки:

A Лямбда-функция Python 3.6 , которую я хочу предварительно подогреть на определенном уровне параллелизма (скажем, 10).Инициализация лямбды достаточно болезненна, и я не хочу навязывать эту стоимость посетителям наугад.Я называю эти лямбды «работниками»

A Узел лямбда-функция , которая запускается каждые 5 минут, чтобы попытаться предварительно прогреть 10 экземпляров.Он использует тип вызова Event для 9 из них, а RequestResponse для 1. В любой момент времени работает только один или ноль этой лямбды.Я называю это «теплее».

Я следовал инструкциям на [https://www.jeremydaly.com/lambda-warmer-optimize-aws-lambda-function-cold-starts/],, а именно:

  • Не пингуйте чаще, чем каждые 5 минут
  • Вызвать функцию напрямую (т.е. не использовать API-шлюз для ее вызова)
  • Передать тестовую полезную нагрузку, которая может быть идентифицирована как таковая
  • Создать логику обработчика, которая отвечает соответствующим образом, не выполняявся функция

Вот проблема: это прекрасно работает в течение нескольких минут.Затем, когда я просматриваю логи, я начинаю получать тайм-ауты от своих рабочих лямбда-вызовов.Тайм-ауты быстро принимают все вызовы, которые пытается запустить теплый.

Теперь ни одна рабочая лямбда больше не разогревается.Но теплее продолжает пытаться, по расписанию cron событий Cloudwatch, терпя 100% тайм-ауты.Наконец, лямбда перестает пытаться запустить мою рабочую лямбду вообще.Такое ощущение, что какой-то аспект лямбды сводит на нет его состояние.Единственный способ восстановить это повторно развернуть лямбду.Это дает мне еще один час, когда работают предварительно нагретые лямбды.

Вопросы:

  • Как мне понять, почему мои рабочие лямбды начинают истекать, а затем перестают отвечать на запросы??
  • Каково определение «параллельного исполнения»?На главной панели Lambda она показывает мне их график.Тем не менее, кажется, что в два раза больше параллельных исполнений, чем я запрашиваю.

enter image description here Вот код-лямбда-разминка (Node):

// warmer
"use strict";

/** Generated by Serverless WarmUP Plugin at ${new Date().toISOString()} */
const aws = require("aws-sdk");
aws.config.region = "${this.options.region}";
const lambda = new aws.Lambda({httpOptions: {timeout: 60000}});
const functionNames = ${JSON.stringify(functionNames)};
const delay = ms => new Promise(res => setTimeout(res, ms))
const concurrency = 10;
module.exports.warmUp = async (event, context, callback) => {
  console.log("Warm Up Start");
  const invokes = await Promise.all(functionNames.map(async (functionName) => {

    let invocations = [];

    try {
      for(let i=1;i <= concurrency;i++){
          let params = {
            FunctionName: functionName,
            InvocationType: (i===concurrency)?'RequestResponse': 'Event',
            LogType: 'None',
            Qualifier: process.env.SERVERLESS_ALIAS || "$LATEST",
            Payload: JSON.stringify({
              source: 'serverless-plugin-warmup',
              '__WARMER_INVOCATION__': i,
              '__WARMER_CONCURRENCY__': concurrency,
              '__WARMER_REQUESTED__': new Date().toISOString(),
            })
          };

          invocations.push(lambda.invoke(params).promise())
      }
      return await delay(75).then(Promise.all(invocations.map(p => p.catch(e => e)))
        .then(results => console.log('results', results))
        .catch(e => {
          console.log(e);
          return e;
        }
        ))
    } catch (e) {
      console.log(\`Warm Up Invoke Error: \${functionName}\`, e);
      return false;
    }
  }));

  console.log(\`Warm Up Finished\`);

}

А вот рабочая лямбда (Python):

    source = event.get('source')
    if source == 'serverless-plugin-warmup':
        time.sleep(0.05)
        print(event)
        return lambda_gateway_response(200, {"status": "lambda warmup"})

1 Ответ

0 голосов
/ 29 октября 2018

Это была более теплая (Узловая) лямбда, растущая на проволоке, хотя все журналы указывали на рабочую (Питонскую) лямбду.После установки context.callbackWaitsForEmptyEventLoop = false проблема исчезла.

...