AWS Lambda 异步并发限制

Jul*_*ian 7 concurrency node.js async.js aws-lambda

我正在开发一个 AWS Lambda 函数,该函数目前会发出数百个 API 调用,但投入生产后将发出数十万个调用。问题是我无法以这种规模进行测试。

我正在使用 async 模块通过async.eachLimit执行我的 api 调用,以便我可以限制并发性(我目前将其设置为 300)。

我不明白的是 AWS Lambda 的限制。这是文档所说的:

每次调用的 AWS Lambda 资源限制

  • 文件描述符数量:1,024
  • 进程和线程数(总计):1,024

据我了解,Node.js 是单线程的,所以我认为我不会超出该限制。我没有使用子进程,并且异步库在这方面也不是那么好。

现在关于这些文件描述符,我的函数严格调用 AWS 的 API 的其余部分,并且我从不写入磁盘,所以我认为我没有使用它们。

其他重要的 AWS Lambda 限制是执行时间和消耗的内存。每次执行时都会非常清楚地报告这些内容,我完全清楚自己是否接近达到这些目标,所以现在让我们忽略这些。

一些背景信息:

我的函数的确切性质是,每次体育比赛开始时,我都需要将所有移动设备订阅适当的 SNS 主题,因此基本上我会重复调用我们自己的 MySQL 数据库,然后调用 AWS SNS 端点。

所以问题是...

在这种情况下,我可以将 AWS Lambda 中的异步并发性推进到什么程度?是否存在任何我没有考虑的实际限制或其他可能发挥作用的因素?

Lif*_*ery 6

据我了解,Node.js 是单线程的,所以我认为我不会超出该限制。我没有使用子进程,并且异步库在这方面也不是那么好。

Node.js 是事件驱动的,而不是单线程的。
Javascript 引擎在单个线程(事件循环)上运行,并将 I/O 操作委托给内部库 ( libuv ),该库处理其线程池和异步操作。
async本身不会打开子进程,但在幕后,无论您是发出 HTTP 请求还是与文件系统交互,您都会将这些操作委托给libuv.

换句话说,您已经利用资源限制很好地回答了自己的问题:

在这种情况下,我可以将 AWS Lambda 中的异步并发性推进到什么程度?是否存在任何我没有考虑的实际限制或其他可能发挥作用的因素?

每次调用的 AWS Lambda 资源限制

  • 文件描述符数量:1,024
  • 进程和线程数(总计):1,024

很难说是否libuv会为每个 I/O 操作打开一个新线程,因此您可能会得到比上面列出的数字多一点的结果。但无论如何,在达到这些限制之前,你可能会耗尽记忆。
底线是不,您将无法在单个 lambda 执行中进行数十万次调用。

关于函数的上下文,根据作业需要运行的频率,您可能希望将 lambda 重构为多次执行(它也会运行得更快),或者将其放在由 lambda 触发自动缩放的 EC2 上。