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.html和https://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,计算组
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,计算数
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)
您的调用代码被限制为并行 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 处的障碍。
| 归档时间: |
|
| 查看次数: |
3276 次 |
| 最近记录: |