本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 SDK 客户端中预热 AWS SDK for Java 2.x
在应用程序初始化期间,使用中的SdkWarmUp AWS SDK for Java 2.x 实用程序预热您的 SDK 客户端。这减少了应用程序在启动或还原后处理的第一个请求的延迟。
在应用程序处理实际流量之前,预热会练习 SDK 请求路径(构建客户端并调用操作)。您可以将其与 Lambda 等检查点和恢复功能一起使用。 SnapStart 这些功能会拍摄初始化应用程序的快照,然后从该快照中恢复以减少冷启动延迟。
否则SdkWarmUp,你必须在每个检查点之前编写自己的热身代码,这很麻烦。使用SdkWarmUp,您只需拨打一个电话即可热情所有客户。您可以预热类路径上的所有 SDK 客户端,也可以仅预热应用程序使用的特定客户端。
在本主题中,您将学习如何配置和SdkWarmUp使用CRaC和 AWS Lambda SnapStart。有关缩短 Lambda 启动时间的其他技术的更多信息,请参阅缩短 SDK 的启动时间 AWS Lambda。
这个 SdkWarmUp API
SdkWarmUp是sdk-core模块的一部分,因此每个服务客户端都可以使用它,无需额外的依赖关系。将您的项目配置为使用 2.54.0 或更高版本的。 AWS SDK for Java 2.x然后调用以下部分中描述的两种静态方法之一。当您调用任一方法时,SdkWarmUp都会进行一次网络调用以预热 HTTP 客户端。为了预热服务客户端,它使用本地预设响应。它不需要 AWS
证书或 IAM 权限,也不会产生 AWS 费用。
预热类路径上的所有 SDK 客户端
该warmUp()方法会发现类路径上的每个 SDK 服务客户端,并预热每个客户端,以及它们使用的 HTTP 客户端。当您依赖少量服务模块并调用它们提供的大多数客户端时,请使用此方法。以下Java代码示例不warmUp()带参数调用:
import software.amazon.awssdk.core.warmup.SdkWarmUp; SdkWarmUp.warmUp();
此方法每个 JVM 最多运行一次。成功调用后,后续调用将立即返回。
预热特定的 SDK 客户端
该warmUp(Class<? extends SdkClient>... clients)方法仅加热您命名的客户端。传递一个同步客户端类来预热同步路径,或者传递一个异步客户端类来预热异步路径。
当您的类路径包含的服务客户端多于应用程序调用时,请使用此方法。例如,当依赖项引入了你不使用的服务模块时,就会发生这种情况。仅命名您需要的客户端可以使预热时间与应用程序的实际使用情况成正比,而不是与您的完整类路径成正比。以下Java代码示例仅预热S3Client和DynamoDbClient类:
import software.amazon.awssdk.core.warmup.SdkWarmUp; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; SdkWarmUp.warmUp(S3Client.class, DynamoDbClient.class);
SdkWarmUp 与 Lambda 一起使用 SnapStart
AWS Lambda SnapStart提高了Java函数的启动性能。当您发布新版本的函数时,Lambda 会对其 SnapStart 进行初始化并拍摄内存和磁盘状态的快照。然后,它会缓存快照以供重复使用。有关支持的运行时以及如何激活 SnapStart 函数的信息,请参阅AWS Lambda 开发者指南。
由于 Lambda 是在处理程序的构造函数运行后拍摄快照的,因此请调用SdkWarmUp.warmUp()构造函数。然后,快照将包括您的预热客户端,并且从快照中恢复的每次调用都会从预热中受益。以下Java代码示例在 Lambda 处理程序构造函数SdkWarmUp.warmUp()中调用:
import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import software.amazon.awssdk.core.warmup.SdkWarmUp; public class MyHandler implements RequestHandler<String, String> { public MyHandler() { SdkWarmUp.warmUp(); // Your other initialization here. } @Override public String handleRequest(String input, Context context) { // Your handler logic here. } }
如果您的函数需要在 Lambda 拍摄快照之前或恢复之后运行自定义代码,请实现 SnapStart 运行时挂钩。有关更多信息,请参阅《AWS Lambda 开发者指南》中的 Java SnapStart 运行时挂钩。
SdkWarmUp 与独立的 CRAC 一起使用
您也可以CRaC直接在管理自己的检查点的应用程序中使用 SdkWarmUp with。本部分显示预热呼叫在已配置的CRaC应用程序中的位置。要为配置应用程序CRaC,请参阅上的 org.crac:crac依赖关系。
在检查站之前热身
SdkWarmUp.warmUp()在初始化期间,在进入检查点之前致电。您的应用程序已经将自己注册为 CraCResource,可以关闭和重新打开检查点周围的连接。将预热调用添加到同一个构造函数中,如以下Java代码示例所示:
import org.crac.Context; import org.crac.Core; import org.crac.Resource; import software.amazon.awssdk.core.warmup.SdkWarmUp; public class MyApp implements Resource { public MyApp() { SdkWarmUp.warmUp(); // Your other initialization here. Core.getGlobalContext().register(this); } @Override public void beforeCheckpoint(Context<? extends Resource> context) throws Exception { // Close your service clients here. } @Override public void afterRestore(Context<? extends Resource> context) throws Exception { // Create your service clients again here. } }
注意
当任何文件描述符处于打开状态时,CraC 都不会使用检查点。如果您使用 AWS CRT-based HTTP 客户端,仅关闭服务客户端是不够的,因为客户端会保持共享事件循环处于打开状态。将其释放beforeCheckpoint,如以下 Java 代码示例所示:
import org.crac.Context; import org.crac.Resource; import software.amazon.awssdk.crt.CrtResource; import software.amazon.awssdk.crt.io.EventLoopGroup; @Override public void beforeCheckpoint(Context<? extends Resource> context) { EventLoopGroup.closeStaticDefault(); CrtResource.waitForNoResources(); }
当您关闭服务客户端时,NettyApache基于和基于 HTTP 客户端会释放其资源,因此它们无需额外拆解。
像往常一样走检查站。
其他资源
以下资源提供有关本节所涵盖主题的更多信息:
-
上的 CraC 文档
GitHub