如何执行N个Lambda函数的并发实例

时间:2019-07-14 02:21:59

标签: amazon-web-services aws-lambda

我正在尝试查看我的代码中是否可以调用N个lambda函数实例。这是我在EC2实例上执行的简单代码:

const AWS = require('aws-sdk');
const https = require('https');

const sslAgent = new https.Agent({
    keepAlive: true,
    maxSockets: 50,
    rejectUnauthorized: true,
});
sslAgent.setMaxListeners(0);

AWS.config.update({
    region: 'us-east-1',
    httpOptions: {
        agent: sslAgent,
    },
});

const lambda = new AWS.Lambda();

function call() {
    return lambda.invoke({
        FunctionName: "test",
        Payload: JSON.stringify({
            wait: 5000,
        }),
    }).promise();
}

(async () => {
  let start = Date.now();
  const promises = [...Array(200).keys()].map(i => {
    return call(new Date(Date.now()).toISOString())
      .then(data => {
        console.log(`Success (${i})`);
      })
      .catch(err => {
        console.log(`Error (${i}): ${err}`);
      });
  });
  await Promise.all(promises);
  let end = Date.now();
  console.log((new Date(end - start).toISOString()).substr(11, 12));
})();

如您所见,此代码将执行名为test的lambda函数200次。然后它将等待所有这些人返回,然后测量所需的时间(如果您感兴趣,则需要20.883秒-是的,我知道它太长了!)。

然后在服务器端,我有这个test lambda函数:

exports.handler = async (event, context, callback) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return new Promise((resolve) => {
        setTimeout(() => {
            callback(null, response);
            resolve();
        }, event.wait);
    });
};

非常简单直接,它会等待请求直到返回。

现在,问题是我执行了此方案,这导致lambda函数仅同时执行50次。我基于CloudWatch上生成的日志知道这一点。在那里,我可以看到lambda函数的每个实例都处理了4个请求(因此,之前报告的20秒-4个顺序执行* 5秒等待等于20秒)。

我可以验证是否没有为lambda函数设置任何并发限制,并且该限制位于默认选项Use unreserved account concurrency上。另外,该帐户是空的,我远远落后于1000个限制。

我的问题是;为什么我不能同时执行所有200个请求,为什么还要面对节流阀?

1 个答案:

答案 0 :(得分:2)

许多AWS开发工具包的服务的默认执行程序池大小为50。由于您还使用AWS开发工具包,因此看起来是同样的问题。您可以尝试并行运行同一脚本多次,但我认为您不应看到相同的50个调用限制。

您可以使用以下方式配置“最大套接字”大小

var https = require('https');
var agent = new https.Agent({
   maxSockets: 200
});
const lambda = new AWS.Lambda({
    httpOptions:{
        agent: agent
    }
});

AWS论坛上的类似问题: https://forums.aws.amazon.com/thread.jspa?threadID=286655