Bru*_*uce 3 amazon-web-services node.js aws-lambda
我用来context.logStreamName识别 lambda 实例。并发设置为无保留。但日志显示只有 50 个实例正在运行。
我是否误解了logStream(pre logStream pre实例)?我从这个博客得到了信息
下面是我对应的代码:
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)
});
}
Run Code Online (Sandbox Code Playgroud)
我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
Run Code Online (Sandbox Code Playgroud)
那么这是否意味着AWS lambda只能运行50个实例?如果是这样,如何增加 AWS Lambda 中的并发数?
除了 1000 个并发执行软限制之外,还有其他事情需要考虑。
如果您使用 lambda 函数来处理不基于轮询的事件,那么您在单个时刻可以运行的实际函数数量不是 1000。计算该数量的公式为
invocations per second * average execution duration in seconds
这意味着,如果您的函数平均执行时间为 20 秒,那么您可以同时运行的该函数的实例数为 1000 / 20,等于 50。
我并不是说您的代码就是这种情况,但在使用 lambda 限制时这绝对是需要考虑的事情。
如果我们谈论基于轮询的函数(Lambda 与 Kinesis 流、DynamoDB 流集成),那么另一个起作用的因素是流中的分片数量。流中的每个分片一次最多可以由特定 lambda 函数的 1 个实例进行处理(请注意,不同的 lambda 函数可以同时处理同一分片)。因此,如果您的流中有 50 个分片,那么您的 lambda 函数可以扩展到 50 个它的实例,但是上面提到的公式仍然成立,因此如果您的函数需要超过 20 秒来处理消息,那么并发执行的数量将为少于 50。
| 归档时间: |
|
| 查看次数: |
3440 次 |
| 最近记录: |