点击上方【凌云驭势 重塑未来】
一起共赴年度科技盛宴!
前言
我们的客户曾告诉我们,他们喜欢 Amazon Lambda 的原因有很多。在开发方面,他们喜欢简单的编程模型,且这些功能还可以轻松地利用其他亚马逊云科技的服务。在运营方面,他们受益于其构建功能强大的应用程序的能力,这些应用程序可以快速响应不断变化的使用模式。
如您所知,如果您已经在使用 Lambda ,那么您的函数是在安全和隔离的执行环境中运行的。每个环境的生命周期包括三个主要阶段: Init 、 Invoke 和 Shutdown 。其中, Init 阶段引导函数的运行时,同步运行函数的静态代码。通常,这些操作在几毫秒内完成,不会以任何明显的方式延长阶段。也有情况是由于其他多种原因,它们可能需要相当长的时间。首先,初始化某些语言的运行时可能很昂贵。例如,结合使用 Java 运行时和框架(如 Spring Boot 、Quarkus 和 Micronaut)的 Lambda 函数的 Init 阶段有时会长达 10 秒钟(这包括依赖注入、函数代码编译和类路径组件扫描)。其次,静态代码可能会下载一些机器学习模型,预先计算一些参考数据,或者与其他亚马逊云科技服务建立网络连接。
Lambda SnapStart 介绍
为了让您能够以更多方式使用 Lambda ,亚马逊云科技推出了 Lambda SnapStart 。
在为特定 Lambda 函数启用 Lambda SnapStart 后,发布该函数的新版本将触发优化过程。该过程会启动您的函数并在整个 Init 阶段运行它。然后,它获取内存和磁盘状态的不可变的加密快照,并缓存以供重用。随后调用该函数时,将根据需要以区块形式从缓存中检索状态,并用于填充执行环境。这种优化使调用时间更快且更具可预测性,因为创建全新的执行环境不再需要专用的 Init 阶段。
我们正在发布对使用 Corretto ( java11 ) 运行时 Java 函数的支持,并期望看到 Lambda SnapStart 立即用于使用 Spring Boot、Quarkus 、Micronaut 和其他 Java 框架的应用程序。为 Java 函数启用 Lambda SnapStart 可以使其启动速度提高 10 倍,而无需支付额外费用。
使用 Lambda SnapStart
我们使用了 Amazon Labs 存储库中的 Serverless Spring Boot 2 示例作为起点。在安装了 Amazon SAM CLI 后,进行了测试构建和部署以建立基准。通过调用这个函数,我们发现 Init 持续时间略超过 6 秒:
然后我们在 template.yml 中添加了两行来配置 SnapStart 属性:
我们重新构建并重新部署,发布了新版本的函数来设置 SnapStart,并进行了另一项测试:
使用 SnapStart 时,初始化阶段(由我前面展示的 Init 持续时间表示)发生在我们发布函数的新版本阶段。当我们调用启用了 SnapStart 的函数时,Lambda 会在调用函数处理程序之前恢复快照(以还原持续时间表示)。因此,SnapStart 的总冷调用时间现在为还原持续时间 + 持续时间。SnapStart 已将冷启动持续时间从超过 6 秒缩短到不到 200 毫秒。
成为 Snap-Resilient
唯一性
使用 SnapStart 时,过去在初始化期间生成的任何唯一内容现在都必须在初始化后生成,以保持唯一性。如果您(或您引用的库)使用伪随机数生成器,则该生成器不应基于在初始阶段获得种子。我们已经更新了 OpenSSL 的 RAND_Bytes ,以确保在与 SnapStart 结合使用时的随机性,并且我们已经验证了 java.security.SecureRandom 已经具有 Snap-Resilient。Amazon Linux 的 /dev/random 和 /dev/urandom 也是 Snap-Resilient。
网络连接
如果您的代码在 Init 阶段创建了到网络服务的长期连接,并在 Invoke 阶段使用,请确保可以在必要时重新建立连接。已更新 Amazon SDK 以实现此目的。
临时数据
这实际上是上述项目的一种更通用的形式。如果您的代码在 Init 阶段下载或计算引用信息,请考虑做一个快速检查,以确保它在缓存期间没有过时。
Lambda 提供了一对运行时挂钩来帮助您保持唯一性,还提供了一个扫描工具来帮助检测可能的问题。
注意事项
以下是关于 Lambda SnapStart 需要了解的其他一些事项:
缓存
缓存的快照在闲置 14 天后将被移除。如果快照依赖于已更新或打过的补丁来运行时, Lambda 将自动刷新缓存。
定价
使用 Lambda SnapStart 不收取额外费用。
功能兼容性
您不能将 Lambda SnapStart 与较大的临时存储、Elastic File System、Provisioned Concurrency 或 Graviton2 一起使用。通常,我们建议将 SnapStart 用于您的通用 Lambda 函数,那些对延迟特别敏感的函数子集建议使用 Provisioned Concurrency。
Firecracker
此功能可利用 Firecracker 快照。
区域
Lambda SnapStart 在美国东部(俄亥俄州、弗吉尼亚北部)、美国西部(俄勒冈州)、亚太地区(新加坡、悉尼、东京)和欧洲(法兰克福、爱尔兰、斯德哥尔摩)区域可用。
本篇作者
Jeff Barr
首席布道师
亚马逊云科技首席布道师,他在2004年开始在亚马逊云科技更新博客,从那时起一直坚持内容产出。
2022亚马逊云科技 re:Invent 全球大会
精彩Keynote主题演讲
👇👇👇点击下方图片即刻观看👇👇👇
听说,点完下面4个按钮
就不会碰到bug了!