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 中的异步并发性推进到什么程度?是否存在任何我没有考虑的实际限制或其他可能发挥作用的因素?
据我了解,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 上。
| 归档时间: |
|
| 查看次数: |
2260 次 |
| 最近记录: |