AWS Lambda如何处理多个请求?

San*_*aju 18 java aws-lambda

AWS Lambda如何处理多个请求?我想知道这是一个多线程的模型吗?

如果我从API网关调用Lambda.并且在10秒内向API发出1000个请求.将创建多少个容器以及多少个线程.

Mic*_*bot 30

AWS Lambda如何处理多个请求?

独立.

我想知道这是一个多线程的模型吗?

不,在您要求的意义上,它不是多线程模型.

当然,您的代码可以编写为使用多个线程和/或子进程来完成一次调用要完成的任何目的,但Lambda不会一次向同一个容器发送多个调用.在第一次调用完成之前,容器不会用于第二次调用.如果第二个请求在第一个请求运行时到达,则第二个请求将在另一个容器中运行.

如果我从API网关调用Lambda.并且在10秒内向API发出1000个请求.将创建多少个容器以及多少个线程?

将创建许多容器,以便在其自己的容器中处理每个到达的请求.

每次调用的持续时间将是这个的最大决定因素.

在10秒内1000个非常快速的请求大约相当于1秒内的100个请求.假设每个请求在不到1秒的时间内完成,并且到达时间均匀分布,则可以预期创建的容器少于100个.

另一方面,如果1000个请求在10秒内到达并且每个请求需要30秒才能完成,则在此事件期间将存在1000个容器.

在交通量增加导致集装箱数量膨胀之后,它们都会徘徊几分钟,准备好在它到达时处理额外的负载,然后Lambda将开始终止它们.

  • @JohnLee 来了:"instance" = "container" -- [*当您的函数被调用的速度比函数的单个实例可以处理事件的速度更快时,Lambda 会通过运行其他实例来扩展。* **您的函数的每个实例一次仅处理一个请求,因此您无需担心同步线程或进程。** *但是,您可以使用异步语言功能并行处理批量事件,并将数据保存到 /tmp 目录用于未来对同一实例的调用。*](https://docs.aws.amazon.com/lambda/latest/dg/programming-model-v2.html) (6认同)
  • 您是否对以下语句有任何参考:“在第一次调用完成之前,容器不会用于第二次调用。” 该声明是否仅适用于 java(OP) 或 Node?谢谢! (4认同)
  • @JohnLee 很难找到清晰、明确、权威的引用,但这适用于所有 Lambda 运行时,并且相对容易为您自己证明 - `/tmp` 目录和全局数据结构是实现这一点的两种方法 -当重用发生时,它们都会在调用中持续存在,但是您将无法创建两个并发调用共享任何内容的设置。您需要为每次调用期间固定分配的内存、CPU 和磁盘付费,如果多个调用共享一个容器,性能显然会下降……但事实并非如此。 (2认同)

STW*_*STW 10

有几个角度可以讨论。

AWS Lambda 确实支持并行处理请求,但 Lambda 的任何单个实例/容器一次只能处理一个请求。如果所有现有实例都很忙,则将配置新实例(取决于并发设置,如下所述)。

在单个 Lambda 实例中支持多线程,但每个实例仍然只能处理一个请求。实际上,并行化在 Lambda 中几乎没有什么好处,它会增加大量开销,最适合处理非常大的集合。此外,Lambda 需要拥有超过 1 个虚拟核心才能发挥作用。核心是通过提高内存设置来配置的——许多 Lambda 运行时内存设置足够低,只有一个核心。

由于存在许多因素,并不总是能够准确确定创建了多少个容器/实例:

  • Lambda 将重用任何现有的、暂停的实例
  • 现有实例通常处理请求的速度非常快,少量的热实例可以在配置新实例的时间内处理很多很多请求(特别是像 Java 或 .NET Core 这样的运行时,其启动时间通常为 1+秒)
  • Lambda 的并发设置是一个重要因素
    • 如果您的预留并发数为 X,则您将永远不会拥有超过 X 个实例
    • 如果您有未预留的并发,则限制基于可用并发。默认情况下每个账户有 1000 个实例,因此如果任何 Lambda 的 990 个实例已存在,则只能创建 10 个
    • 如果您配置了并发,那么您将始终拥有最小数量的实例,从而减少冷启动

但是,为了尝试回答您的故事问题,我们假设您在 10 分钟内以稳定的速度发送 1000 个请求。即每 600 毫秒发出一个请求。我们还假设您的 Java 应用程序被分配了相当高的内存,并且其初始化速度相对较快——假设冷启动需要 1 秒。冷启动完成后,调用速度很快——假设为 10 毫秒。并且,我们假设没有流量开始的情况。

第一个请求的响应时间约为 1,010 毫秒——冷启动需要 1 秒,处理请求需要 10 毫秒。当第一个请求仍在处理时,第二个请求将到达,因此 Lambda 很可能会配置第二个实例,并且第二个请求将看到类似的响应时间。

当第三个请求到来时(启动后 1800 毫秒),两个实例现在都处于空闲状态并且可以重用——因此该请求不会经历冷启动,并且响应时间将为 10 毫秒。从现在开始,可能不需要额外的实例——但这一切都假设请求率稳定。

但是——改变任何变量都会产生很大的影响。


Ash*_*han 5

AWS Lambda 能够通过为多个容器水平扩展来处理多个请求。默认情况下,Lambda 最多可支持 1000 个并行容器执行

10 秒内有 1000 个请求到 API。将创建多少个容器以及多少个线程。

每秒请求数 = 1000/10 = 100

假设每次执行需要 1 秒或更长时间才能完成,将有 100 个并行 Lambda 执行。

注意:您也可以生成多个线程,但很难预测性能增益。

另请记住,拥有多个线程并不总是有效您的 Lambda 函数可用的 CPU 在您的 Lambda 函数创建的所有线程和进程之间共享。通常,通过在多个线程之间并行运行工作,您不会在 Lambda 函数中获得更多 CPU。在这种情况下,您的代码实际上不是在两个内核上运行,而是在单个内核上的两个“超线程”上运行;根据工作负载,这可能比单线程更好或更差。服务团队正在寻找更好地利用 Lambda 执行环境中的多个内核的方法,我们会将您的反馈视为对该功能的 +1。

参考:AWS 论坛帖子

有关 Lambda 并发执行的更多详细信息,请参阅aws 文档。

  • 您在解释中结合了两个不相关的概念。请注意表的标题:*每次调用的 AWS Lambda 资源限制*。这是线程和进程**在一个** Lambda 调用中的限制。并发调用不会相互交互。它们中的每一个都可以独立地创建多达 1024 个线程/进程(很少是您需要的),每个都有 512M 的临时空间,每个都有您提供的内存量,并且它们不会与每个线程/进程竞争其他用于 CPU 周期。并发调用限制是一个类似的数字,只是巧合。 (5认同)
  • *“注意:默认情况下,Lambda 最多可以支持 1000 个(进程和线程的总和)并发执行。”* 这是不正确的。进程和线程在这里不是一个因素。1000 个并发调用意味着 1000 个**容器**。每次调用都完全独立于任何其他调用。您在代码中使用进程和线程所做的任何事情都适用于 *one* 调用——而不是跨越它们。 (4认同)