【问题标题】:AWS Lambda - sync vs asyncAWS Lambda - 同步与异步
【发布时间】:2017-01-06 00:02:08
【问题描述】:

我最近一直在使用 Lambda,并且正在使用 API Gateway 和 Lambda 创建一个 API。我有一个返回 JSON 的 lambda 函数和一个调用该函数的 API 网关端点。这个简单的设置一切正常。

我尝试使用 loadtest npm 模块对 API 网关端点进行负载测试。虽然 Lambda 处理并发请求(尽管在执行过程中平均延迟会增加),但当我每秒向它发送 40 个左右的请求时,它开始抛出错误,仅完成部分请求。

我在文档中读到,默认情况下,Lambda 调用的类型是 RequestResponse(这是 API 现在所做的),它本质上是同步的,并且看起来是非阻塞的。对于异步调用,调用类型为 Event。但是 lambda 会丢弃异步调用的返回类型,API 什么也不返回。

关于 AWS 的同步、异步或并发定义有什么我遗漏的吗?有没有更好的方法来解决这个问题?任何见解都是有帮助的。谢谢!

【问题讨论】:

    标签: amazon-web-services asynchronous aws-lambda aws-api-gateway


    【解决方案1】:

    如果您想从 API Gateway 获得返回响应,则必须使用同步执行。在这种情况下使用异步执行没有意义。我认为您缺少的是,虽然每个 Lambda 执行都是阻塞的、单线程的,但您的函数的多个实例将在多个 Lambda 服务器环境中运行。

    出于安全原因,并发 Lambda 执行的默认数量相当低。这是为了防止您在学习 Lambda 时不小心编写了一个会花费大量资金的失控的 Lambda 流程。您需要在您账户的 Lambda 并发执行限制中 request an increase。

    【讨论】:

    • 太棒了!这就是我到目前为止收集的内容,但文档似乎有点模棱两可。我确实注意到随着更高的并发性(我将其提高到 40),平均延迟会增加。就像你提到的那样,这仅仅是因为我们在 100 个并发阈值限制下运行吗?对于更高请求的并发,速度应该变得更好? (我在 lambda 函数上也有类似的内存体验。128megs 并没有减少它 - 平均延迟大约是 6 秒。将内存增加到 512 可以将其降低到 800ms。)
    • 是的,一旦你增加了这个限制,你应该能够在不增加延迟的情况下获得更高的并发性。我很想知道在您的限额提高后这对您是否有效。
    • 您可能还想研究在 API Gateway 中启用缓存以提高重复请求的性能。并且您需要确保 API Gateway 中的速率限制设置不会将并发请求限制在您希望支持的级别以下。
    • @MarkB 但是如果 lambda awaits (没有像你回答的那样阻塞)同时另一个请求到达,(第一个 lambda)实例将被重用? (因为基本上awaits 将控制权返回给aws)还是现在会有2个实例?我没有找到任何文档
    • @RoyiNamir 不,Amazon 不能只销毁 Lambda 实例并在您的函数等待时重用实例底层的物理硬件,然后在您的函数等待时以某种方式重构实例及其所有内存状态await 完成。您最终要为 Lambda 函数使用的物理硬件付费,该硬件在函数调用的生命周期内为该 Lambda 函数实例保留。
    猜你喜欢
    • 2018-02-09
    • 2021-10-20
    • 2021-12-30
    • 2021-08-31
    • 2020-11-10
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多