我有大约 50 个 AWS Lambda 函数,我有一个 gulp 任务来部署它,脚本压缩函数并将其上传到 S3,然后使用 Lambda JS SDK 我调用此任务来创建/更新函数:

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 错误,zip 大小为 13MB,解压版本为 50MB。我不认为大小是问题所在,而是对 SDK 的并发调用。

在哪里可以找到有关可以对 AWS 开发工具包执行多少个并发调用的信息?您建议我如何解决 TooManyRequestsException 错误?代码示例值得赞赏。

请您参考如下方法:

zip 的大小似乎不是问题(请参阅 http://docs.aws.amazon.com/lambda/latest/dg/limits.html )。

当超出 AWS 授权该账户的 Lambda 进程数量时,我收到了 TooManyRequestsException。以下是围绕这种限制需要考虑的一些事项:

  1. 一开始的限制约为 100。请参阅 https://aws.amazon.com/lambda/faqs/了解详情。据我了解,这意味着最好的情况是,如果没有发生其他情况,在任何给定时间最多只能运行 100 个 Lambda 进程。

  2. Lambda 进程结束的时间和结束进程计入您的限额的时间之间存在延迟。我不确定是否有明确的指导说明该时间是多长;根据我的经验,它的范围从几秒钟到一分钟左右。因此,如果您有一个使用 50 个 lambda 的进程,并且每个 lambda 需要 60 秒来运行,那么最好的情况是,限制为 100,您可以每分钟运行该进程两次,但实际上它可能会受到更多限制.

  3. 如果您向亚马逊发送服务限制增加请求(支持 -> 创建案例 -> 服务限制增加),您的限制可以增加。您必须提供诸如每秒请求数、请求持续时间等信息。

  4. 非常重要:Lambda 进程可能会自动重试 - 请参阅 https://aws.amazon.com/lambda/faqs/ ,特别是“如果我的帐户超出并发执行的默认限制,会发生什么?”以及“如果我的 Lambda 函数在处理事件期间失败会发生什么?”。这意味着,如果您超出了限制,并且继续进行测试,则可能会积压仍在重试(并耗尽限制)的进程。

基于此,您可能需要执行以下操作:

  1. 自行管理重试,不要使用亚马逊的内置重试机制,特别是对于任何交互式和/或测试目的。例如在 Node 中:

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

    然后您可以使用以下方法进行管理:

    lambda.invoke(lambda_params, function(err, obj){ 
        if(err){ 
            if(err.toString().match(/TooManyRequestsException/)) ... 
    
  2. 如果您想确保停止任何可能仍失控运行的 Lambda(无论是由于重试还是因为您的代码中可能存在错误),请删除您的 Lambda 函数。例如从控制台: aws lambda 删除函数 --函数名称 my_outofcontrol_func

  3. 在尝试扩展之前,请经常使用测试功能(AWS Dashboard -> Lambda -> 选择您的函数 -> 测试)。日志也很有帮助——因此,如果您调用 50 个 lambda 进行测试,您可以转到日志并查看这 50 个 lambda 发生了什么。

  4. 当您需要扩展时,请提前向亚马逊请求。这需要几天的时间,对我和我听说的其他人来说,他们总是想给你比你要求的少的东西。如果您有使用过现有容量的历史,这会有所帮助。请注意,一旦您达到大约 1000 个 Node ,无需进行大量测试,您就会突破免费套餐并开始为每次使用付费(更有理由进行大量#3)。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!