2016-04-17 2 views
1

У меня около 50 AWS Lambda функций, у меня есть задачи gulp для его развертывания, сценарий zip функции и загрузить его на S3, а затем с помощью Lambda JS SDK Я вызываю эту задачу для создания/обновления функции:AWS Lambda SDK - TooManyRequestsException

gulp.task('upload', function (callback) { 
    var AWS = require('aws-sdk'); 
    var lambda = Promise.promisifyAll(new AWS.Lambda(), { 
    filter: function (name) { 
     return name.indexOf('Async') === -1; 
    } 
    }); 
    var promises = require('./lambda-config.js').lambda.map(function (lambdaConfig) { 
    return lambda.getFunctionConfigurationAsync({ 
     FunctionName: lambdaConfig.FunctionName 
    }).then(function() { 
     return lambda.updateFunctionCodeAsync({ 
     FunctionName: lambdaConfig.FunctionName, 
     S3Bucket: lambdaConfig.Code.S3Bucket, 
     S3Key: lambdaConfig.Code.S3Key 
     }); 
    }).catch(function() { 
     return lambda.createFunctionAsync(lambdaConfig); 
    }); 
    }); 
    Promise.all(promises).then(() => callback()).catch(callback); 
}); 

Я получаю TooManyRequestsException error, размер почтового индекса является 13MB и распакованные версии 50Мб. Я не думаю, что размер проблемы, а одновременные вызовы SDK.

Где я могу найти информацию о том, сколько одновременных вызовов я могу выполнить для AWS SDK? и как вы предлагаете я могу решить TooManyRequestsException error? Оценивается образец кода.

ответ

0

Похоже, что существует проблема с параллелизмом здесь. У меня была та же проблема, что и многие обещания, а затем их исполнение с Promise.all

Это было решено с использованием библиотеки Promise Bluebird, которая имеет аналогичную функцию Promise.map, которая также обрабатывает параллелизм.

Код будет что-то в соответствии с этим:

const Promise = require('bluebird'); 

Promise.map(arrayWithLambdas, lambda => { 

     //Deploy each lambda 

    }, { concurrency: 5}) // Control concurrency 
    .then(() => { 

     // Handle successful deploy of lambdas 
    }) 
    .catch(() => { 

     // Handle unsuccessful deploy of lambdas 
    }) 
}; 
1

Размер почтового индекса не является проблемой (см. http://docs.aws.amazon.com/lambda/latest/dg/limits.html).

Я получил исключение TooManyRequestsException при превышении количества процессов лямбды, которые AWS разрешил этой учетной записи. Вот несколько вещей, чтобы рассмотреть вокруг такого рода предел:

  1. Вы начинаете с лимитом около 100.See https://aws.amazon.com/lambda/faqs/ для деталей. Насколько я понимаю, это означает, что в лучшем случае, если ничего не происходит, у вас может быть не более 100 процессов лямбда, работающих в любой момент времени.

  2. Существует отставание между тем, как завершается процесс Лямбды, и время, закончившееся процессом, возвращается к вашему пределу. Я не уверен, есть ли четкие указания относительно того, как долго это время; по моему опыту он колеблется от нескольких секунд до минуты или около того. Поэтому, если у вас есть процесс, который использует 50 лам, а каждая лямбда занимает 60 секунд, то лучший случай, с лимитом 100, вы можете запустить этот процесс два раза в минуту, но на самом деле он, вероятно, будет немного более ограниченным, чем ,

  3. Ваш лимит может быть увеличен, если вы отправите Amazon запрос на увеличение лимита обслуживания (Поддержка -> Создать кейс -> Увеличение лимита обслуживания). Вам необходимо будет предоставить информацию, такую ​​как количество запросов в секунду, продолжительность запроса и т. Д.

  4. ОЧЕНЬ ВАЖНО: процессы Lambda могут автоматически повторять - см. https://aws.amazon.com/lambda/faqs/, esp «Что произойдет, если моя учетная запись превышает дроссель по умолчанию ограничение на одновременные казни? " и «Что произойдет, если моя функция Lambda завершится неудачно во время обработки события?». Это означает, что если вы превысили свой лимит и продолжаете тестирование, у вас может быть отставание процессов, которые все еще повторяются (и используют ваш лимит).

Исходя из этого, вы можете сделать следующее:

  1. Управление RETRIES себя, и не использовать встроенный механизм повторного запуска Amazon, особенно для чего-нибудь интерактивного и/или для в целях тестирования. например в узле:

    var lambda = new AWS.Lambda({ 
        region: REGION, 
        maxRetries:0, 
        .... 
    }); 
    

    вы можете управлять с помощью что-то вроде:

    lambda.invoke(lambda_params, function(err, obj){ 
        if(err){ 
         if(err.toString().match(/TooManyRequestsException/)) ... 
    
  2. Если вы хотите быть уверены, чтобы остановить любое лямбды, что все еще может быть запущена из-под контроля (будь то из-за повторных попыток или потому что у вас может быть ошибка в вашем коде), удалите свою лямбда-функцию. напримерот консоли: aws lambda delete-function --function-name my_outofcontrol_func

  3. Перед тем, как попытаться масштабировать, используйте функциональность тестирования (панель управления AWS -> Lambda -> выберите вашу функцию -> Тест). Журналы также полезны - поэтому, если вы вызываете 50 лямбда для теста, вы можете пойти в журнал и посмотреть, что произойдет с этими 50 лямбдами.

  4. Когда вам нужно масштабировать, запросите его у Amazon раньше времени. Это займет несколько дней, и для меня, и для других, о которых я слышал, они всегда хотят дать вам меньше, чем вы просите. Это помогает, если у вас есть история, когда вы уже использовали имеющуюся у вас емкость. Остерегайтесь, как только вы доберетесь до 1000 узлов, вам не потребуется много испытаний, прежде чем вы пропустите свободный уровень и начнете платить за каждое использование (больше оснований делать много # 3).

+0

Спасибо за ваш ответ, но это если я вызов (выполнения) функции лямбды, но моя проблема сейчас связана с развертыванием , когда я пытаюсь развернуть функции, я использую функции lambda sdk для развертывания, и он возвращает ошибку TooManyRequestsException. Ничто в документации лямбда указывает, есть ли предел для создания или обновления функций, что я заметил, что я получаю эту ошибку только в регионе eu-west-1, в то время как я не получаю ее в нашем регионе-восток-1. И никакой информации в AWS о каких-либо ограничениях, которые были превышены. –

+0

Я вижу. Не знаю ограничений на одновременное развертывание, но пара других способов скина кошки может включать объединение ваших многочисленных функций в многофункциональные отдельные функции (затем использование параметра для определения того, какую подфункцию выполнять) и/или использование функция setTimeout() в вашей загрузке для размещения ваших запросов или просто выполните ваши запросы последовательно. Обновления развертывания не должны возникать так часто, что производительность должна быть высокоприоритетной (если это не так, пересмотреть свой дизайн ...). – mwag

+0

Спасибо за ответ, если вы не возражаете, я спрашиваю, какое частое развертывание связано с производительностью? учитывая, что я только делаю разработку, и я постоянно пересматриваю изменения на ежедневной основе? Просто любопытно, и вы хотите получить от вас больше разъяснений. Я читал, что лямбда-функции всегда остаются на месте, а время выполнения зависит от того, насколько часто вы используете эту функцию, и я думаю, что это проблема, если некоторые функции не используются очень часто. –