【发布时间】:2022-02-19 04:08:48
【问题描述】:
我有一个 lambda 函数,它在生产环境中很少被调用,但它是面向公众的,所以我想避免冷启动。所以我想我可以使用预置并发来避免这个问题。我的 Cloudformation 模板如下所示:
QuoteLinkServiceFunction:
Type: AWS::Serverless::Function
Properties:
# other lambda properties...
ProvisionedConcurrencyConfig:
ProvisionedConcurrentExecutions: 1
但当我在我的测试环境中创建此堆栈时(我是唯一的用户,因此没有同时发生其他调用),几个小时后返回使用此功能时,我仍然会遇到冷启动。随着 lambda 的预热,第一次调用后的后续调用运行得更快。
lambda 控制台显示此函数的别名实际上已设置为预配置并发 1,并且我已验证 ALB 目标组指向该别名。那为什么我还是开始冷?
【问题讨论】:
-
你确定这些真的是冷星延迟,而不是实例的数据库连接问题吗?您是否考虑过使用 X 射线进行追踪?
-
@BAD_SEED 我还没有设置 X 射线,但你可能是对的。为了与docs.aws.amazon.com/lambda/latest/dg/best-practices.html 保持一致,我在处理程序构造函数(它是一个 .NET Core lambda)中的函数处理程序之外进行了一些初始繁重的工作,因此函数处理程序本身对于每次调用都非常轻量级。我现在意识到,我只是假设当 lambda 预热时会调用处理程序构造函数,但我想它不会那样做 - lambda 可能只是保持容器准备就绪,并延迟调用构造函数和处理程序直到第一次调用.
-
@BAD_SEED 如果您想重新发布您的评论作为答案,我很乐意接受。
-
我也看到了同样的问题,它显然与这里的答案无关,因为在 cloudwatch 中,它有一段时间没有呼叫后的初始呼叫:
REPORT RequestId: 3c0d1c43-4dc3-4059-9e51-203ed4387756 Duration: 492.12 ms Billed Duration: 493 ms Memory Size: 256 MB Max Memory Used: 101 MB初始化持续时间:4831.59 毫秒。其他调用没有初始化持续时间。由于预配置的并发性,我永远不会在 cloudwatch 中看到 Init Duration。有任何想法吗?您在 cloudwatch 中有 Init Duration 吗? -
其实我假设 Init Duration 包括构造函数的时间,但仍然 provisionedConcurrency 应该阻止它被召回?
标签: aws-lambda