AWS Lambda SnapStart 配置
SnapStart 是一种快照和恢复机制,可以显著减少 AWS 上 Java 函数的冷启动时间。本文档介绍了可用于利用此功能的各种设置。它不是 SnapStart 的参考文档,也不会详细介绍 SnapStart 的工作原理。
此功能仅在 AWS Lambda 上可用,并非在所有区域都可用。请查看 AWS 文档以验证您的 AWS 区域的资格。 |
启用/禁用 SnapStart 优化
如果您使用 Quarkus AWS Lambda 扩展,则会自动启用 SnapStart 优化。但是,您可以使用以下方式显式启用/禁用它
quarkus.snapstart.enable=true|false
它不会启用/禁用函数的 SnapStart,只会启用/禁用 Quarkus 优化。 |
类预加载
类加载对函数的执行时间有很大影响。此优化允许在 SnapStart 的快照过程中预加载类。
要预加载的类在两个位置列出
-
扩展可以生成类列表(使用
io.quarkus.deployment.builditem.PreloadClassBuildItem
构建项) -
您可以添加一个
src/main/resources/META-INF/quarkus-preload-classes.txt
文件,列出要预加载的类,例如
com.amazonaws.services.lambda.runtime.LambdaRuntimeInternal
com.fasterxml.jackson.annotation.JsonAlias
com.fasterxml.jackson.annotation.JsonFormat$Feature
com.fasterxml.jackson.core.exc.InputCoercionException
com.fasterxml.jackson.core.exc.StreamWriteException
com.fasterxml.jackson.core.io.ContentReference
com.fasterxml.jackson.core.io.IOContext
com.fasterxml.jackson.core.io.JsonEOFException
com.fasterxml.jackson.core.io.MergedStream
com.fasterxml.jackson.core.io.NumberInput
com.fasterxml.jackson.core.io.NumberOutput
com.fasterxml.jackson.core.io.UTF32Reader
com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper
com.fasterxml.jackson.core.json.JsonReadContext
com.fasterxml.jackson.core.json.JsonWriteContext
com.fasterxml.jackson.core.json.UTF8StreamJsonParser
com.fasterxml.jackson.core.JsonEncoding
com.fasterxml.jackson.core.JsonGenerationException
com.fasterxml.jackson.core.JsonLocation
com.fasterxml.jackson.core.JsonStreamContext
com.fasterxml.jackson.core.JsonToken
...
格式很简单:每行一个类。
计算类列表
该步骤特别不用户友好。我们计划改进它。 |
要计算类列表,我们建议部署您的函数并将 JAVA_TOOL_OPTIONS
环境变量设置为 -verbose:class
。然后执行您的函数并检索日志(在 CloudWatch 中)。您应该能够使用 sed/awk 或任何文本编辑器提取类名。
客户端预热
客户端预热是一种技术,允许在快照过程中初始化客户端,使其在应用程序运行时已完全可用。
有两种方法可以实现预热
-
在
static
块中初始化客户端,由于类预加载,这将在快照之前执行 -
注册一个执行初始化的 CRaC 资源
(1) 可以按如下方式实现
@ApplicationScoped
public class HeroRepository {
private static final DynamoDbClient client;
static {
client = DynamoDbClient.builder()
.region(Region.US_EAST_2)
.credentialsProvider(DefaultCredentialsProvider.create())
.build();
client.describeEndpoints();
}
// ...
}
使用静态块实现预热可能会阻止应用程序的本机编译。如果该类在构建时初始化,则客户端初始化可能会启动线程或打开与本机编译不兼容的连接。 |
下一节介绍 (2)。
资源注册
SnapStart 使用 CRaC API 允许应用程序在快照之前或恢复期间执行自定义代码。
虽然它是 CRaC API,但 SnapStart 不是 CRaC,并且可以执行一些与其他 CRaC 实现不兼容的操作。 |
package org.acme.hello;
import io.quarkus.runtime.Startup;
import org.crac.Context;
import org.crac.Core;
import org.crac.Resource;
import org.jboss.logging.Logger;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
@Startup
@ApplicationScoped
public class HelloPriming implements Resource {
@Inject
Logger logger;
@PostConstruct
void init() {
// Important - register the resource
Core.getGlobalContext().register(this);
}
@Override
public void beforeCheckpoint(Context<? extends Resource> context) throws Exception {
logger.info("before checkout hook");
// initialize your client here.
}
@Override
public void afterRestore(Context<? extends Resource> context) throws Exception {
logger.info("after checkout hook");
// if there is anything to do during the restoration, do it here.
}
}
恢复时间限制为 2 秒。 |