我正在尝试查看我的代码中是否可以调用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个请求,为什么还要面对节流阀?
答案 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