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将开始终止它们.
STW*_*STW 10
有几个角度可以讨论。
AWS Lambda 确实支持并行处理请求,但 Lambda 的任何单个实例/容器一次只能处理一个请求。如果所有现有实例都很忙,则将配置新实例(取决于并发设置,如下所述)。
在单个 Lambda 实例中支持多线程,但每个实例仍然只能处理一个请求。实际上,并行化在 Lambda 中几乎没有什么好处,它会增加大量开销,最适合处理非常大的集合。此外,Lambda 需要拥有超过 1 个虚拟核心才能发挥作用。核心是通过提高内存设置来配置的——许多 Lambda 运行时内存设置足够低,只有一个核心。
由于存在许多因素,并不总是能够准确确定创建了多少个容器/实例:
但是,为了尝试回答您的故事问题,我们假设您在 10 分钟内以稳定的速度发送 1000 个请求。即每 600 毫秒发出一个请求。我们还假设您的 Java 应用程序被分配了相当高的内存,并且其初始化速度相对较快——假设冷启动需要 1 秒。冷启动完成后,调用速度很快——假设为 10 毫秒。并且,我们假设没有流量开始的情况。
第一个请求的响应时间约为 1,010 毫秒——冷启动需要 1 秒,处理请求需要 10 毫秒。当第一个请求仍在处理时,第二个请求将到达,因此 Lambda 很可能会配置第二个实例,并且第二个请求将看到类似的响应时间。
当第三个请求到来时(启动后 1800 毫秒),两个实例现在都处于空闲状态并且可以重用——因此该请求不会经历冷启动,并且响应时间将为 10 毫秒。从现在开始,可能不需要额外的实例——但这一切都假设请求率稳定。
但是——改变任何变量都会产生很大的影响。
AWS Lambda 能够通过为多个容器水平扩展来处理多个请求。默认情况下,Lambda 最多可支持 1000 个并行容器执行。
10 秒内有 1000 个请求到 API。将创建多少个容器以及多少个线程。
每秒请求数 = 1000/10 = 100
假设每次执行需要 1 秒或更长时间才能完成,将有 100 个并行 Lambda 执行。
注意:您也可以生成多个线程,但很难预测性能增益。
另请记住,拥有多个线程并不总是有效您的 Lambda 函数可用的 CPU 在您的 Lambda 函数创建的所有线程和进程之间共享。通常,通过在多个线程之间并行运行工作,您不会在 Lambda 函数中获得更多 CPU。在这种情况下,您的代码实际上不是在两个内核上运行,而是在单个内核上的两个“超线程”上运行;根据工作负载,这可能比单线程更好或更差。服务团队正在寻找更好地利用 Lambda 执行环境中的多个内核的方法,我们会将您的反馈视为对该功能的 +1。
参考:AWS 论坛帖子
有关 Lambda 并发执行的更多详细信息,请参阅此aws 文档。