【问题标题】:What's the best way to invoke a large volume AWS lambda function?调用大量 AWS lambda 函数的最佳方法是什么?
【发布时间】:2017-08-09 20:04:17
【问题描述】:

我想到了一个可能需要在短时间内调用大量 Lambda 函数的服务。例如一个非常繁忙的频道中的聊天机器人,用 lambda 编写的机器人在每条新消息上都会被调用。 Lambda 似乎是一个很好的解决方案。

我用 AWS SDK 写了一个简单的测试代码:

var lambda = new AWS.Lambda({apiVersion: '2015-03-31'});

function invoke() {
  var start = new Date();
  var params = {
    FunctionName: 'test', /* required */
    InvocationType: 'RequestResponse',
    LogType: 'None',
    Payload: '{}',
  };
  lambda.invoke(params, function(err, data) {
    if (err) {
      console.log(err, err.stack); // an error occurred
    }
    else  {
      var duration = new Date() - start;
      console.info("Execution time: %dms", duration);
    }
  });
}

for (var i = 0; i < n; i++) {
  invoke();
}

lambda 函数“test”是一个非常简单的函数,它基本上什么都不做,只是返回输入事件。在 lambda 控制台中,执行时间通常不到 10 毫秒。我在自己的笔记本电脑上进行了测试,所以网络延迟约为 200~300 毫秒。从我的开发计算机上进行一次调用大约需要 600~800 毫秒。

小批量运行看起来还可以:

$ node test.js 5
Execution time: 637ms
Execution time: 652ms
Execution time: 646ms
Execution time: 713ms
Execution time: 850ms

但是,如果我大批量运行它,延迟会变得非常大,并且变得越来越大:

$ node test.js 1000
Execution time: 3569ms
Execution time: 4418ms
Execution time: 3571ms
Execution time: 4505ms
Execution time: 3661ms
Execution time: 3322ms
Execution time: 3645ms
Execution time: 3654ms
Execution time: 3651ms
Execution time: 4531ms
...
Execution time: 71851ms
Execution time: 70879ms
Execution time: 71777ms

我知道 AWS-SDK 实际上是发出 HTTP 请求来调用 lambda,因此 AWS 会限制并发连接并且请求可能会排队并减慢它们是有道理的。所以以这种方式调用大量的 lambda 似乎不太可能...... :(

我将通过发送 SNS 对其进行测试,但不确定这是否是一个好的解决方案,因为我希望从那些 lambda 函数中获得结果。

更新:我还将代码放在另一个部署到同一区域的 lambda 函数中,所以我认为网络延迟最小,它看起来肯定更快,但似乎有同样的问题。

START RequestId: 7bd3339d-8986-11e5-85d1-67b32d2e2f9c Version: $LATEST
2015-11-12T21:44:00.923Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #0
2015-11-12T21:44:01.003Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #1
2015-11-12T21:44:01.005Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #2
2015-11-12T21:44:01.063Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #3
2015-11-12T21:44:01.065Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #4
2015-11-12T21:44:01.122Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #5
2015-11-12T21:44:01.123Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #6
2015-11-12T21:44:01.124Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #7
2015-11-12T21:44:01.124Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #8
2015-11-12T21:44:01.182Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Lambda invoke #9
2015-11-12T21:44:01.182Z    7bd3339d-8986-11e5-85d1-67b32d2e2f9c    Execution time: 753ms
END RequestId: 7bd3339d-8986-11e5-85d1-67b32d2e2f9c
REPORT RequestId: 7bd3339d-8986-11e5-85d1-67b32d2e2f9c  Duration: 873.46 ms Billed Duration: 900 ms     Memory Size: 128 MB Max Memory Used: 14 MB  

我的问题是,有没有办法在很短的时间内调用大量 lambda?

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-sdk


    【解决方案1】:

    您需要异步调用 Lambda(如@Matt Beckman 所示),并且您需要增加您的 Lambda account limits。如果您必须维护状态或检索返回的结果,那么您需要找到另一种方法来做到这一点,例如追加到 SQS 队列或 DynamoDB 表。

    【讨论】:

      【解决方案2】:

      如果您将InvocationTypeRequestResponse 切换到Event,那么您的函数将运行您的调用以异步调用。

      【讨论】:

      • 我想从 lambda 函数中取回结果,我认为 InvocationType Event 不会得到结果,我将不得不寻找另一种方法来取回结果?
      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 2016-01-19
      • 2013-06-25
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      相关资源
      最近更新 更多