AWS Lambda函数是否可以保持热启动?

29

我的应用程序中有一些部分,这些部分无法承受 Lambda 函数的“冻结-解冻”周期所导致的额外 1-2 秒延迟,当这些函数处于新状态或未使用一段时间时。

我该如何保持这些 Lambda 函数的热度,以便 AWS 不必一直重新为它们提供资源?这适用于1)不经常使用的函数和2)最近部署的函数。

理想情况下,我错过了一个名为“保持热”的设置,可以增加 Lambda 函数的成本,但始终保持函数处于热态,并随时准备好响应,但我相当确定这不存在。

我想一个选项是使用 CloudWatch 计时器定期调用这些函数...但这感觉不对。此外,我不知道 AWS 使用什么间隔来使 Lambda 函数冷却。


5
目前实现您想要的唯一方法是使用类似CloudWatch定时器的工具定期触发该函数。 - Mark B
谢谢@MarkB,你有理想的间隔时间吗?我在Lambda文档中找不到任何具体数字。我们是在讨论每1分钟的ping还是每1小时的ping? - samcorcos
4
据我了解,您可能希望执行5到15分钟的某个操作。请在处理程序外部声明一个全局变量,然后在处理程序内部,仅当变量尚未设置时,将其设置为context.awsRequestId的值... 然后记录该变量的值。这样,您就可以获得一个基本上是唯一的容器ID,可以用于跟踪容器的重用情况并确定您的策略的有效性。将时间存储在类似的变量中,并使用递增的计数器,就可以获得很好的视角。 - Michael - sqlbot
2
不错的文章!不过,我认为您误用了“冻结/解冻”概念。冻结/解冻循环是在保留变量。只有当您使用新启动的容器--而不是先前被解冻的容器时--才会看到延迟:'Lambda实际上会“冻结”进程,并在下一次调用函数时解冻它(但在容器被重用时,这并不是一个保证)。' 当没有可供解冻和重用的冻结容器时,长时间的启动时间就会出现。 - Michael - sqlbot
此外,如果您仔细想一想,一个容器中的200个同时调用会表现得非常糟糕,因为这200个任务将竞争CPU和内存。如果不是这样,那么系统如何知道在具有200个核心和300 GiB RAM的机器上运行这200个调用的容器?提出问题就是回答...它不可能以这种方式工作。 - Michael - sqlbot
显示剩余5条评论
2个回答

14

10
BBC发表了一篇关于iPlayer engineering的好文章,其中描述了类似的问题。
他们选择使用CloudWatch Scheduled Events每隔几分钟调用一次该函数。

理论上,它应该一直待在那里,但可能不会。因此,我们设置了定期事件来保持容器“温暖”。我们每隔几分钟调用一次该函数,而不进行任何处理,但确保我们已准备好模型。这占调用的非常小的百分比,但有助于我们缓解模型下载中的竞争条件。(我们还人为地限制了并行调用的Lambda数量,作为额外的措施)。


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