并行多次调用 lambda 似乎是在 50 个并发批次中执行,而不是使用更高指定的保留并发数

cur*_*onk 3 amazon-web-services node.js aws-lambda

TL;DR 对于并行执行的一批 500 个 lambda,我观察到它们以 50 个并发批次执行,尽管指定的保留并发度为 500。这是为什么?

你好,

我是 AWS lambda 新手,无法理解我所看到的并发行为。

我正在调用一个 lambda 函数“calc-group”[从 AWS Web 界面或 CLI],它并行调用另一个 lambda 函数“calc-number”500 次,其中后者指定了 500 的保留并发度。运行,计算结果一切正常】。

“calc-number”大约需要 1s 执行,但“calc-group”需要 10s 执行。并发执行图表表明我得到的并发数仅为 50,与我看到的 10 倍时间一致。 [注意:“calc-number”的更详细实现(此处未显示)也证明只有 50 个 lambda 执行上下文从每个顺序处理 10 个请求开始]。

我正在使用Promise.all承诺进行同步lambda.invoke调用。

我已阅读https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.htmlhttps://docs.aws.amazon.com/lambda/latest/dg/inspiration-scaling.html但不明白发生了什么。

下面是一个隔离行为的精简示例。 [注意:我知道这里的内存比所需的要高得多,但它使计时更加稳定,并且原始代码受 CPU 限制,受益于此设置]。

我非常感谢任何关于如何让所有 500 个并行执行的建议......

非常感谢!

编辑:简化了代码,阅读了有关异步 Node.js 处理程序中的错误处理的更多信息 + 较小的整理

编辑:仅供参考,如果我并行地重复调用 calc-group,则 calc-number 的并发执行会成比例增加。例如,如果我并行调用 calc-group 5 次(我从 CLI 进行测试),那么我会看到 calc-number 有 250 个并发执行,尽管发出并执行了 2500 个请求。(超过 10 个 calc-group 并行请求,请求开始被拒绝)。 那么似乎还有其他 50 的上限/约束,可能与 lambda 调用的来源有关?是否有任何相关文件或增加方法?


Lambda #1,计算组

  • 运行时:Node.js 12.x
  • 内存(MB):2048
  • 超时:0 分 15 秒
  • 允许调用 calc-number 的角色
const AWS = require('aws-sdk');
const lambda = new AWS.Lambda();

exports.handler = async (event) => {

    const n = 500;

    const promises = [];
    for (let x = 1; x <= n; ++x) {
        promises.push(
            lambda.invoke({
                FunctionName: "calc-number",
                Payload: JSON.stringify({x})
            }).promise()
        );
    }

    const data = await Promise.all(promises);

    const results = data.map(d => {
        const payload = JSON.parse(d["Payload"]);
        return payload["result"]
    });

    const sum = results.reduce((a, x) => a + x, 0);

    return { sum };
};
Run Code Online (Sandbox Code Playgroud)

Lambda #2,计算数

  • 运行时:Node.js 12.x
  • 内存(MB):2048
  • 超时:0 分 3 秒
  • 预留并发数:500
const util = require('util');
const sleep = util.promisify(setTimeout);

exports.handler = async (event) => {

    const x = event["x"] || 0;

    const result = x * x;

    await sleep(1000);
    
    return { result };
};
Run Code Online (Sandbox Code Playgroud)

Mic*_*bot 5

您的调用代码被限制为并行 50 个 SDK 请求,因为您似乎没有更改默认值。

当使用默认值时https,SDK 会maxSockets从 中获取值globalAgent。如果该maxSockets值未定义或为Infinity,则 SDK 假定maxSockets值为 50。

https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-configuring-maxsockets.html

构建和签署每个 API 请求都需要 CPU 时间,因此修复此问题可能无法让您在单个 Node 进程中达到您想要的程度,但它将消除 50 处的障碍。