我正在使用context.logStreamName
来标识lambda实例。并发设置为未保留。但是它的日志显示只有50个实例正在运行。
我误解了logStream(在logStream实例之前)吗?我从this blog
获得了信息以下是我的相应代码:
let instances = {};
for (let i = 0; i < each_invokes; i++) {
lambda.invoke(params, function (err, data) {
if (err) {
console.log(err, err.stack);
} else {
// console.log(data);
let logs = Buffer.from(data.LogResult, 'base64').toString('utf8');
let instanceID = logs.match(new RegExp("\\$InstanceID: (.*?) \\$END", "ig"))[0].split(" ")[1];
if (instanceID) {
if (instances.hasOwnProperty(instanceID)) {
instances[instanceID] += 1
} else {
instances[instanceID] = 0
}
console.log(instanceID, instances[instanceID], 'StatusCode:', data.StatusCode);
} else {
console.log('missing instanceID:', data.StatusCode)
}
}
console.log(Object.keys(instances).length)
});
}
我console.log(context.logStreamName)
在我的lambda函数上,并使用RegExp
扭曲实例ID。
尾部日志继续显示以下输出:
b4afda96edf04e07ab819589d298521d 3 StatusCode: 200
50
a1ef1f4b518d47398daedda434ddd48c 3 StatusCode: 200
50
8dedc647796545ada94770895a8b190a 3 StatusCode: 200
50
7c4f48d72de0486e86e47c76ed3269ec 3 StatusCode: 200
50
2aa1f0dc9b0440fcac3d3127d123edb8 3 StatusCode: 200
50
3d1abeb38e7a45a4b933b669ad0c12d7 3 StatusCode: 200
50
531883ce26ac43b9bb0976726a2e5aa6 3 StatusCode: 200
50
cb9d0611a2e24244bd9ee98967a768c2 3 StatusCode: 200
50
那么这意味着AWS lambda只能运行50个实例吗?如果可以,如何增加AWS Lambda中的并发计数?
答案 0 :(得分:2)
除了1000个并发执行软限制之外,还需要考虑其他事项。
如果您使用lambda函数处理非基于轮询的事件,那么您一次可以运行的实际函数数量不是1000。计算数量的公式为
invocations per second * average execution duration in seconds
这意味着,如果您的函数平均需要20秒才能执行,那么可以同时运行的该函数的实例数为1000/20,等于50。
我并不是说您的代码就是这种情况,但是在使用lambda限制时绝对是要考虑的事情。
如果我们正在谈论基于轮询的功能(与Kinesis流,DynamoDB流集成的Lambda),那么另一个起作用的因素是流中的分片数量。流中的每个分片一次最多只能处理1个特定lambda函数的实例(请注意,不同的lambda函数可以同时处理同一分片)。因此,如果流中有50个分片,则lambda函数最多可以扩展到50个实例,但是上面提到的公式仍然成立,因此,如果您的函数需要20秒钟以上的时间来处理消息,那么并发执行的次数将是少于50。
答案 1 :(得分:1)
自2019年6月起,Lambda并发执行设置为 1000 。
AWS由于各种原因强加service limits on its resources。可以使用service limit increase on your console来提高或提高大多数限制。
Lambda has a special page描述了其局限性,并解释了如何理解Lambda scales。只能增加concurrency
和Function and Layer Storage
。
我们需要从您的问题中获取更多信息,以确定您为什么限制为50岁。
如果我要猜测的话,我认为您是通过GetMetricData访问CloudWatch日志,每秒has a limit of 50?
答案 2 :(得分:1)
我认为获得50个实例日志的原因之一是上一个lambda函数处理的延迟时间与下一次冷启动的时间之间的平衡。并发的配置设置没有告诉我它将立即冷启动1000个未保留的帐户并发。它确实会收到1000个请求,但是一旦它立即可以为下一个请求释放,则无需冷启动另一个实例。但我不确定这是否正确。
我可以确认的另一个原因是AWS的default limit。
“ AWS Lambda的默认安全限制是每个区域每个帐户100个并发执行。如果您希望提交增加100个并发执行的请求,可以访问我们的支持中心...”
我没有找到官方文档,但手动找到了限制:
当我将并发设置为100时,然后在本地计算机上启动两个调用脚本,每个脚本同时发送500个调用。它将在队列上接收结果日志。日志上的实例数将逐渐增加到100个实例,而不是50个实例,这是一个调用脚本的结果。
但是,如果并发是100,但是我启动了三个调用脚本,该怎么办?它会启动150个实例吗?不,它将抛出TooManyRequestsException
错误。
此测试不严格,仍在调查中。尽管这不是生产上的严重问题,但我真的很想了解为什么会出现此问题。
-更新-
问:我一次可以执行的AWS Lambda函数的数量有限制吗?
不。 AWS Lambda旨在并行运行许多功能实例。但是,AWS Lambda的默认安全限制是每个区域每个帐户100个并发执行。如果您想提出增加100个并发执行的请求,可以访问我们的支持中心,单击“打开新案例”,然后提出服务限制增加请求。
问:如果我的帐户超过并发执行的默认限制,该怎么办?
超过限制阈值时,被同步调用的AWS Lambda函数将返回限制错误(429错误代码)。异步调用的Lambda函数可以吸收大约15到30分钟的合理流量,此后传入事件将被抑制。如果要响应Amazon S3事件而调用Lambda函数,则AWS Lambda拒绝的事件可能会保留并由S3重试24小时。重试来自Amazon Kinesis流和Amazon DynamoDB流的事件,直到Lambda函数成功或数据到期为止。 Amazon Kinesis和Amazon DynamoDB流将数据保留24小时。
---更新---
正如我和Matus Dubrava提到的那样,我管理了lambda函数的复杂性以监视函数的运行时间。指标显示如下:
很明显,我们看到Duration(持续时间(最大值为300k))与ConcurrentExecutions(我将最大并发次数设置为100)之间存在关系。