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 触发自动缩放。
我正在开发一个 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 触发自动缩放。