Amazon web services 如何执行lambda函数的N个并发实例

Amazon web services 如何执行lambda函数的N个并发实例,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,我想看看是否可以在代码中调用lambda函数的N个实例。这是我在EC2实例上执行的简单代码: const AWS = require('aws-sdk'); const https = require('https'); const sslAgent = new https.Agent({ keepAlive: true, maxSockets: 50, rejectUnauthorized: true, }); sslAgent.setMaxListeners(0);

我想看看是否可以在代码中调用lambda函数的N个实例。这是我在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
200次的lambda函数。然后,它将等待所有这些数据返回,然后测量需要多长时间(如果您感兴趣,需要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个请求(因此在-4顺序执行之前报告的20秒*5秒等待等于20秒)

我可以验证我没有为lambda函数设置任何并发限制,并且它位于默认选项
使用无保留帐户并发
。此外,帐户是相当空的,我远远落后于1000的限制


我的问题是,;为什么我不能同时执行所有200个请求,为什么我要面临限制?

许多AWS SDK服务的默认执行器池大小为50。因为您也在使用AWS SDK,所以看起来是相同的问题。您可以尝试并行多次运行同一个脚本,我认为您不应该看到相同的50次调用限制

您可以使用以下内容配置最大套接字大小

var https = require('https');
var agent = new https.Agent({
   maxSockets: 200
});
const lambda = new AWS.Lambda({
    httpOptions:{
        agent: agent
    }
});
AWS论坛上的类似问题:

My bad,更改代码中的50可以解决问题。问题一直摆在我面前。这就是你迟到的原因。谢谢。你能在你的帖子中加入这个补丁吗?这样我就可以把它标记为答案了?谢谢。是的,这些问题是最糟糕的。我添加了一个解决方案来更改max socket连接。让我知道这是否是你想要的修复方法。