为什么只有 50 个实例在 AWS lambda 上运行?

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 中的并发数?

Mat*_*ava 5

除了 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。