View a markdown version of this page

中的暖機 SDK 用戶端 AWS SDK for Java 2.x - AWS SDK for Java 2.x

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

中的暖機 SDK 用戶端 AWS SDK for Java 2.x

在應用程式初始化期間,使用 中的 SdkWarmUp公用程式 AWS SDK for Java 2.x 來暖機您的 SDK 用戶端。這可減少應用程式在啟動或還原後處理的第一個請求的延遲。

在應用程式處理實際流量之前,暖機期會練習 SDK 請求路徑 (建立用戶端和叫用 操作)。您可以將其與 Lambda SnapStart 等checkpoint-and-restore功能搭配使用。這些功能會取得初始化應用程式的快照,然後從該快照還原,以減少冷啟動延遲。

如果沒有 SdkWarmUp,您必須在每個檢查點之前撰寫自己的暖機程式碼,這很麻煩。使用 SdkWarmUp,您可以進行單一呼叫來暖化所有用戶端。您可以在 classpath 上暖化所有 SDK 用戶端,或只暖化應用程式使用的特定用戶端。

在本主題中,您將了解如何設定和SdkWarmUp使用 搭配 CRaC 和 AWS Lambda SnapStart。如需減少 Lambda 啟動時間之其他技術的詳細資訊,請參閱 縮短 的 SDK 啟動時間 AWS Lambda

SdkWarmUp API

SdkWarmUpsdk-core 模組的一部分,因此它可供每個服務用戶端使用,無需額外的相依性。將您的專案設定為使用 2.54.0 版或更新版本。 AWS SDK for Java 2.x然後,呼叫以下各節所述的兩種靜態方法之一。當您呼叫任一方法時, SdkWarmUp 會進行一次網路呼叫來暖化 HTTP 用戶端。為了暖機服務用戶端,它使用本機的固定回應。它不需要 AWS 登入資料或 IAM 許可,也不會產生 AWS 費用。

暖機 classpath 上的所有 SDK 用戶端

warmUp() 方法探索 classpath 上的每個 SDK 服務用戶端,並暖機每個用戶端,以及它們使用的 HTTP 用戶端。當您依賴少量服務模組並呼叫他們提供的大多數用戶端時,請使用此方法。下列Java程式碼範例在沒有引數warmUp()的情況下呼叫 :

import software.amazon.awssdk.core.warmup.SdkWarmUp; SdkWarmUp.warmUp();

此方法每個 JVM 最多執行一次。成功呼叫後,後續呼叫會立即傳回。

暖機特定 SDK 用戶端

warmUp(Class<? extends SdkClient>... clients) 方法只會暖機您命名的用戶端。傳遞同步用戶端類別以暖機同步路徑,或傳遞非同步用戶端類別以暖機非同步路徑。

當您的 classpath 包含比應用程式呼叫更多的服務用戶端時,請使用此方法。例如,當相依性引入您未使用的服務模組時,就會發生這種情況。僅命名您需要的用戶端會保持暖機時間與應用程式的實際用量成正比,而不是完整的 classpath。下列Java程式碼範例只會暖機 S3ClientDynamoDbClient類別:

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);

搭配 Lambda SnapStart 使用 SdkWarmUp

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 執行期掛鉤。如需詳細資訊,請參閱《 開發人員指南》中的適用於 Java 的 SnapStart 執行期掛鉤AWS Lambda

搭配獨立 CRaC 使用 SdkWarmUp

您也可以在管理自己檢查點的應用程式中,CRaC直接使用 SdkWarmUp搭配 。本節顯示暖機呼叫在已針對 設定之應用程式中的所屬位置CRaC。若要設定 的應用程式CRaC,請參閱 上的Step-by-step CRaC 支援GitHub。該演練涵蓋支援的 JDK 分佈、平台先決條件,以及生命週期界面所需的org.crac:crac相依性。

在檢查點之前預熱

在您接受檢查點之前,在初始化SdkWarmUp.warmUp()期間呼叫 。您的應用程式已將自己註冊為 CRaC,Resource以關閉和重新開啟檢查點周圍的連線。將暖機呼叫新增至相同的建構函數,如下列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 型 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(); }

當您關閉服務用戶端時, Netty型和 Apache型 HTTP 用戶端會釋出其資源,因此不需要額外的縮減。

像往常一樣接受檢查點。

其他資源

下列資源提供有關本節涵蓋主題的詳細資訊: