这可能会很长,但请耐心等待,因为这可能会为您提供解决方法,并且可能会让您更好地理解Lambda 的工作原理?
或者,如果您对阅读不感兴趣,您可以跳至底部“解决方法”。
对于不了解冷启动的人,请阅读此博客文章以更好地理解它。简而言之:
冷启动
- 当一个函数第一次执行或者在函数代码或资源配置更新之后,一个容器将被启动来执行这个函数。所有代码和库都将加载到容器中以使其能够执行。然后代码将运行,从初始化代码开始。初始化代码是在处理程序之外编写的代码。此代码仅在第一次创建容器时运行。最后,执行 Lambda 处理程序。这个设置过程被认为是冷启动。
- 为了提高性能,Lambda 能够重用以前调用创建的容器。这将避免初始化新容器和加载代码。只有处理程序代码将被执行。但是,您不能依赖先前调用中的容器来重用。如果您没有更改代码并且没有太多时间过去,Lambda 可能会重用以前的容器。
- 如果您更改了代码、资源配置或自上次调用以来已经过去了一段时间,则会初始化一个新容器,您将遇到冷启动。
现在考虑这些场景以便更好地理解:
- 考虑第一次调用示例中的 Lambda 函数。Lambda 将创建一个容器,将代码加载到容器中并运行初始化代码。然后将执行函数处理程序。此调用将经历冷启动。正如评论中提到的,该功能需要 15 秒才能完成。一分钟后,再次调用该函数。Lambda 很可能会重新使用上一次调用中的容器。此调用不会经历冷启动。
- 现在考虑第二种情况,第二次调用在第一次调用后 5 秒执行。由于前一个函数需要 15 秒才能完成并且尚未完成执行,因此新的调用将必须创建一个新容器才能执行此函数。因此,此调用将经历冷启动。
现在提出您已解决的问题的第一部分:
关于防止冷启动,这是一种可能,但不能保证,常见的解决方法只会保温 Lambda 函数的一个容器。为此,您将使用计划事件(cron 表达式)运行 CloudWatch 事件,该事件将每隔几分钟调用一次您的 Lambda 函数以使其保持温暖。
解决方法:
对于您的用例,您的 Lambda 函数将以非常高的并发率被非常频繁地调用。为避免尽可能多的冷启动,您将需要保持尽可能多的容器,以达到您期望的最高并发性。为此,您需要延迟调用函数以允许此函数的并发性构建并达到所需的并发执行量。这将迫使 Lambda 增加您想要的容器数量。因此,这会增加成本,并且不能保证避免冷启动。
话虽如此,这里是关于如何一次为您的函数保持多个容器温暖的分解:
这里有几点需要考虑:
您将必须构建并发性,因为如果第一次调用在另一个调用开始之前完成,那么这个调用可能会重用以前的调用容器而不是创建一个新的容器。为此,如果控制器函数调用了 Lambda 函数,则需要在该函数上添加某种延迟。这可以通过使用这些调用将特定的有效负载传递给函数来完成。然后,您想要保持温暖的 lambda 函数将检查此有效负载是否存在。如果是,则该函数将等待(以构建并发调用),如果不是,则该函数可以按预期执行。
如果您重复调用 Invoke Lambda API 调用,您还需要确保它不会受到限制。应编写您的 Lambda 函数来处理这种限制(如果发生),并考虑在 API 调用之间添加延迟以避免限制。
最后,此解决方案可以减少冷启动,但会增加成本,并且不能保证会发生冷启动,因为它们在使用 Lambda 时是不可避免的。如果您的应用程序需要更快的响应时间,那么使用 Lambda 冷启动会发生什么,我会建议考虑将您的服务器放在 EC2 实例上。