Amazon web services 如何执行lambda函数的N个并发实例
我想看看是否可以在代码中调用lambda函数的N个实例。这是我在EC2实例上执行的简单代码: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);
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连接。让我知道这是否是你想要的修复方法。