我正在使用AWS Lambda函数,该函数目前正在进行数百次API调用,但在投入生产时,它将产生数十万次。问题是我不能按这种规模进行测试。
我使用异步模块用async.eachLimit执行我的api调用,这样我就可以限制并发性(我目前设置为300)。
我不明白的是AWS Lambda的限制。这是the docs所说的:
每次调用的AWS Lambda资源限制
- 文件描述符数:1,024
- 进程数和线程数(总计):1,024
据我了解,Node.js是单线程的,所以我不认为我会超过这个限制。我没有使用子进程,异步库在这方面也没那么好。
现在关于那些文件描述符,我的函数严格调用了AWS的其余API,我从不写入磁盘所以我不认为我&#39 ;使用它们。
其他重要的AWS Lambda限制是执行时间和消耗的内存。每次执行都会清楚地报告这些内容,而且当我接近或不接触时,我完全清楚,所以暂时忽略这些。
我的功能的确切性质是每次体育比赛开始时我都需要将所有移动设备订阅到相应的SNS主题,所以基本上我会重复调用我们自己的MySQL数据库然后调用AWS SNS端点。
在此上下文中,我可以在AWS Lambda中推送异步的并发性多长时间?是否有任何实际的限制或其他可能发挥作用的东西,我不考虑?
答案 0 :(得分:3)
据我了解,Node.js是单线程的,所以我不认为我 会超过这个限制。我没有使用子进程和异步 图书馆在这方面也没那么好。
Node.js是事件驱动的,而非单线程
Javascript引擎在单个线程(事件循环)上运行,并将I / O操作委托给处理其线程池和异步操作的内部库(libuv)。
async
不会自行打开子进程,但在幕后,无论您是在发出HTTP请求还是与文件系统进行交互,您都要将这些操作委托给{ {1}}。
换句话说,您已经使用资源限制很好地回答了您自己的问题:
在这种情况下,我可以在AWS Lambda中推送异步的并发性多长时间?是否有任何实际限制或其他可能发挥作用的其他我不考虑的内容?
每次调用的AWS Lambda资源限制
- 文件描述符数:1,024
- 进程数和线程数(总计):1,024
很难说libuv
是否会为每个I / O操作打开一个新线程,因此您可能会远远超过上面列出的数字。但无论如何,你可能会在达到这些限制之前耗尽或记忆
底线是不,你不能在一次lambda执行中完成数十万次调用。
关于你的函数的上下文,根据你的工作需要运行的频率,你可能想要将lambda重构为多次执行(它也会运行得更快),或者让它在由lambda触发的自动缩放的EC2上