是否可以让 AWS Lambda 函数保持温暖?

Posted

技术标签:

【中文标题】是否可以让 AWS Lambda 函数保持温暖?【英文标题】:Is it possible to keep an AWS Lambda function warm? 【发布时间】:2017-08-10 04:36:05 【问题描述】:

当 Lambda 函数是新的或在一段时间内未使用时,我的一些应用程序无法承受由“冻融”周期引起的额外 1-2 秒延迟。

如何让这些 Lambda 函数保持温暖,以便 AWS 不必一直重新配置它们?这适用于 1) 不常用的功能和 2) 最近部署的功能。

理想情况下,我错过了一个名为“保持温暖”的设置,它会增加 Lambda 函数的成本,但始终保持函数温暖并准备好响应,但我很确定这不存在。

我想一个选项是使用 CloudWatch 计时器每隔一段时间对函数执行 ping 操作……但这对我来说感觉不对。另外,我不知道 AWS 使用 Lambda 函数的时间间隔。

【问题讨论】:

使用诸如 CloudWatch 计时器之类的东西每隔一段时间对函数执行一次 ping 操作是目前完成您想要的事情的唯一方法。 谢谢@MarkB 你对理想间隔有感觉吗?我似乎在 Lambda 文档中找不到任何具体数字。我们是在说 1 分钟的 ping 吗? 1 小时 ping? 有趣的是,我认为您想要 5 到 15 分钟范围内的内容。在处理程序外部声明一个全局变量,然后在处理程序内部,将该变量设置为来自context.awsRequestId 的值仅当它尚未设置时...然后记录该变量的值。这实际上为您提供了一个唯一的容器 ID,您可以使用它来跟踪容器重用并确定策略的有效性。将时间存储在一个类似的变量和一个递增的计数器中,你就会得到一个很好的视角。 @Michael-sqlbot 我进行了一些测试(请参阅链接),看起来间隔并不重要......想法? medium.com/@SamCorcos/… 好帖子!但请注意,我相信您误用了“冻结/解冻”概念。冻结/解冻循环是保留变量的原因。当你使用一个新启动的容器——而不是一个之前被冻结的解冻容器——你会看到延迟:'Lambda will actually “freeze” the process and thaw it out the next time you call the function (but only if the container is reused, which isn’t a guarantee).' 长时间的启动时间是指没有一个可以解冻和重复使用的冷冻容器. 【参考方案1】:

BBC 在iPlayer engineering 上发表了一篇不错的文章,其中描述了类似的问题。

他们选择使用CloudWatch Scheduled Events每隔几分钟调用一次函数。

所以理论上,它应该只是停留在那里,除非它可能不会。所以我们设置了一个预定的事件来保持容器“温暖”。我们每隔几分钟调用一次该函数,不是为了进行任何处理,而是为了确保我们已经准备好模型。这仅占调用的一小部分,但有助于我们缓解模型下载中的竞争条件。(我们还人为地限制了我们并行调用的 lambda 数量作为附加措施)。

【讨论】:

【参考方案2】:

2019 年 12 月更新

AWS 现在还提供“预置并发”。 https://aws.amazon.com/blogs/aws/new-provisioned-concurrency-for-lambda-functions/

基本上,您要为每个想要保持“温暖”的实例每月支付大约 10 美元(对于 1GB Lambda)。

【讨论】:

以上是关于是否可以让 AWS Lambda 函数保持温暖?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?

如何保证提供数据的 aws lambda 调用者保持安全

是否可以通过JSON配置文件创建AWS lambda函数?

AWS Lambdas可以接收入站TCP连接吗?

是否可以向使用 AWS Amplify 预置的 lambda PostAuthenticate 函数授予额外权限?

是否可以在 aws lambda 中使用 bigquery?