AWS Lambda异步并发限制

7
我正在开发一个AWS Lambda函数,目前需要调用数百个API,但在投入生产后将会调用数十万次。问题是我无法以那样的规模进行测试。
我使用async模块来执行我的api调用,使用async.eachLimit以便我可以限制并发(我当前将其设置为300)。
我不理解的是AWS Lambda的限制。这里是文档中所说的:
AWS Lambda每次调用的资源限制
文件描述符数量:1024
进程和线程数量(总和):1024
据我所知,Node.js是单线程的,所以我认为不会超过该限制。我没有使用子进程,async库也没有使用,所以在这方面OK。
现在关于那些文件描述符,我的函数严格调用了AWS的其余API,并且我从未写入磁盘,因此我认为我没有使用它们。
其他重要的AWS Lambda限制是执行时间和内存消耗。每次执行时都会清楚地报告它们,我非常清楚自己是否接近达到它们的限制,因此现在我们忽略这些限制。
一点背景信息:
我的函数的确切性质是,每当开始一场体育比赛时,我需要订阅所有移动设备到相应的SNS主题,因此基本上我会反复调用我们自己的MySQL数据库,然后是AWS SNS终端节点。
所以问题是...
在这种情况下,我能够推动AWS Lambda中异步并发的极限吗?是否存在任何实际限制或其他可能影响我未考虑的因素?

你的意思是一个 Lambda 执行会进行成千上万次调用,还是多个 Lambdas? - LifeQuery
@LifeQuery 一个Lambda执行中使用异步方式进行成千上万个调用。因此,我的后端调用Lambda函数,而Lambda函数则进行数千次API调用。 - Julian
1
Node.js 其实不是单线程的。JavaScript 在单个线程中执行,但当进行 IO 操作时,例如网络请求和磁盘操作,它会在另一个线程中执行。因此,如果您使用 async.map 并为每个项目进行网络请求,则可能会创建与您发出的请求数量相同的线程。 - justin.m.chase
1个回答

6
据我理解,Node.js是单线程的,因此我不认为会超出限制。我没有使用子进程,async库也没有使用,所以在这方面OK。
Node.js是事件驱动的,而不是单线程的。
Javascript引擎在单个线程上运行(事件循环),并将I/O操作委托给内部库(libuv),该库处理其线程池和异步操作。
async本身不会打开子进程,但在幕后,无论您是进行HTTP请求还是与文件系统交互,都会将这些操作委托给libuv
换句话说,您已经通过资源限制很好地回答了自己的问题:
“在这种情况下,我可以在AWS Lambda中推动async的并发性到什么程度?是否存在任何实际限制或其他可能影响我的东西?”

AWS Lambda每次执行的资源限制

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

很难说libuv是否会为每个I/O操作打开一个新线程,因此您可能会得到比上面列出的数字更多的资源。但是在达到这些限制之前,您很可能会耗尽内存。
最重要的是不,您无法在单个Lambda执行中进行数十万次调用。

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


我相信这些限制适用于同一Lambda函数的所有执行。因此,如果您有两个函数并行执行,它们仍然具有合计1,024的组合总数。我也曾将其解释为每次执行,但经过大量测试后,发现所有相同类型的Lambda函数共享限制的行为是一致的。 - justin.m.chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接