AWS Lambda - 同步 vs 异步

11

最近我一直在使用Lambda,尝试使用API Gateway和Lambda创建API。我已经编写了一个Lambda函数来返回JSON数据以及一个API Gateway端点来调用该函数。这个简单的设置运行良好。

我试图使用loadtest npm模块对API Gateway端点进行负载测试。当我每秒发送大约40个请求时,虽然Lambda处理了并发请求(随着执行时间的增加,平均延迟略有增加),但它开始抛出错误,只完成部分请求。

我在文档中看到,默认情况下,Lambda调用的类型是RequestResponse(这就是API现在所做的),它是同步的,而且似乎是非阻塞的。对于异步调用,调用类型为Event。但是Lambda会丢弃异步调用的返回类型,因此API什么也不返回。

在AWS中,无论是同步、异步还是并发定义方面,我是否漏掉了什么?有更好的方法来解决这个问题吗?任何见解都很有帮助。谢谢!

1个回答

7
如果您想从API网关获得返回响应,那么您将需要使用同步执行。在这种情况下,使用异步执行是没有意义的。我认为您所忽略的是,虽然每个Lambda执行都是阻塞的、单线程的,但是会有多个实例在多个Lambda服务器环境中运行。
出于安全考虑,默认的并发Lambda执行数量相当低。这是为了防止您在学习Lambda时不小心编写一个耗费大量资金的运行失控的Lambda进程。您需要在您的账户上请求增加 Lambda并发执行限制。

1
@MarkB 但是如果 lambda await(不像您回答的那样阻塞),同时另一个请求到达,那么 那个(第一个lambda) 实例会被重用吗?(因为基本上 await 将控制权返回给 AWS),还是现在会有两个实例?我没有找到任何文档。 - Royi Namir
1
@MarkB 在JS中等待Promise或在C#方法上等待,我认为这并不重要(依我之见)。我想问的是,我们是否需要在等待lambda时付费(异步等待)。我已经阅读过,这并不重要,无论等待与否,我们都会根据从A-->Z的总执行时间来计费。而且,如果lambda在C-->T之间没有做任何事情,也不会有影响,价格仍然由A-->Z决定。对吗? - Royi Namir
1
@RoyiNamir 这些操作并没有“将控制权返回给 AWS”,它们只是解除了 Lambda 函数的执行阻塞,以便在等待 Promise 返回时可以执行其他异步操作。像这样等待 Promise 的 Lambda 函数实例不会被重用于另一个请求。 - Mark B
1
@MarkB 谢谢 Mark,但是我们使用异步/等待在 Lambda 中是否可以获得更便宜的 AWS? - Royi Namir
2
@RoyiNamir 不,亚马逊不能在您的函数等待时销毁Lambda实例并重用实例底层的物理硬件,然后在您的await完成后以所有内存状态重新构建实例。您最终支付的是Lambda函数正在使用的物理硬件,该硬件为函数调用的生命周期保留了Lambda函数实例。 - Mark B
显示剩余4条评论

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