使用Amazon Lambda SnapStart 为您的 Lambda 函数提速

021544ee98e391e8cabcfe49f3f23dd0.png

726b7e106408b775481035dde63ef779.gif

点击上方【凌云驭势 重塑未来】

一起共赴年度科技盛宴!

前言

我们的客户曾告诉我们,他们喜欢 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 秒:

07387228e817af89c0bfccac0d2e003e.png

然后我们在 template.yml 中添加了两行来配置 SnapStart 属性:

da7d700cc1c8e653a9f51563bbbc0aad.png

我们重新构建并重新部署,发布了新版本的函数来设置 SnapStart,并进行了另一项测试:

f002e2a3dd8999d61d0085df22dcfbc0.png

使用 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 在美国东部(俄亥俄州、弗吉尼亚北部)、美国西部(俄勒冈州)、亚太地区(新加坡、悉尼、东京)和欧洲(法兰克福、爱尔兰、斯德哥尔摩)区域可用。

本篇作者

800a6dc17ea38d77c8fb703bed2ed2c5.jpeg

    Jeff Barr

   首席布道师

亚马逊云科技首席布道师,他在2004年开始在亚马逊云科技更新博客,从那时起一直坚持内容产出。

2022亚马逊云科技 re:Invent 全球大会

精彩Keynote主题演讲

👇👇👇点击下方图片即刻观看👇👇👇

218b505f4d1329380a4cb48c80dd7baf.png

9ad9bd3d9d22c3d401a0d81c5b70496b.gif

733ad3594af2b8e70b07621fff0fbb1b.gif

听说,点完下面4个按钮

就不会碰到bug了!

78dfa756b911cd36dfdc819ca8eb45ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值