AWS Lambda 异步并发限制

AWS Lambda async concurrency limits

我正在开发一个 AWS Lambda 函数,该函数目前进行了数百次 API 调用,但在投入生产时它将进行数十万次调用。问题是我无法在那个规模上进行测试。

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

我不明白的是 AWS Lambda 的限制。 the docs 是这样说的:

AWS Lambda Resource Limits per Invocation

  • Number of file descriptors: 1,024
  • Number of processes and threads (combined total): 1,024

据我了解,Node.js 是单线程的,因此我认为我不会超过该限制。我没有使用子进程,异步库在这方面也不太好。

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

其他重要的 AWS Lambda 限制是执行时间和消耗的内存。这些在每次执行时都有非常清楚的报告,我完全清楚何时接近或不接近它们,所以让我们暂时忽略这些。

一点上下文:

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

所以问题是...

在此上下文中,我可以将 AWS Lambda 中的异步并发性提高到什么程度?是否有任何我没有考虑到的实际限制或其他可能起作用的因素?

As I understand it, Node.js is single threaded so I don't think I would exceed that limit. I'm not using child processes and the async library doesn't either so OK on that front too.

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

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

在此上下文中,我可以将 AWS Lambda 中的异步并发性提高到什么程度?是否有任何我没有考虑到的实际限制或其他可能起作用的因素?

AWS Lambda Resource Limits per Invocation

  • Number of file descriptors: 1,024
  • Number of processes and threads (combined total): 1,024

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

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