如何減少 Java Lambda 函數的初始化和調用持續時間延遲?

1 分的閱讀內容
0

我的 Java AWS Lambda 函數沒有以最佳方式執行。為什麼會發生這種情況?如何減少 Java 函數的初始化和持續時間延遲?

簡短描述

有兩個主要因素可能會導致 Java Lambda 函數出現高延遲:

Java 虛擬機器 (JVM) 延遲類別載入

為了減少記憶體用量,JVM 會延遲初始化 Java 類別庫,直到首次在應用程式中呼叫該庫。此延遲可能會導致大量輸入輸出 (I/O) 操作,從而導致 Lambda 執行環境中首次调用的持續時間延遲較長。

Java Reflection API

Java Reflection API 允許 Java 程式碼探索有關其他類別、介面,欄位和方法的資訊,然後對其基礎值進行操作。由於反射涉及動態解析的類型,因此無法執行特定 JVM 優化。因此,反射操作的效能比非反射同類產品更慢。

若要優化 Java Lambda 函數的效能,您可以實作本文所述的一或多個最佳實務。

**注意:**若要查看特定案例研究,請觀看 AWS re:Invent 2019: AWS Lambda 和 Java 的最佳實務

解決方法

為 Lambda 函數設定已佈建並行

已佈建並行會初始化請求數量的執行環境,以便準備好立即回應函數的调用。若要為您的函數設定已佈建並行,請遵循設定已佈建並行中的指示進行操作。

如需詳細資訊,請參閱管理 Lambda 函數的並行

**注意:**設定已佈建並行會向您的 AWS 帳戶收取費用。您可以在函數版本或 Lambda 函數別名上設定已佈建並行。

在函數處理常式之外初始化函數的靜態邏輯

當您初始化 Lambda 函數時,Lambda 會配置最多 10 秒的主機 CPU 容量爆量。由於此 CPU 爆量,因此最佳實務是在函數處理常式之外執行下列動作:

  • 匯入程式庫和相依性
  • 設定組態
  • 初始化與其他服務的連線

此靜態初始化允許每個沙盒對這些資源進行一次初始化,然後重複用於執行環境中的所有未來调用。

如需詳細資訊,請參閱優化靜態初始化

對函數處理程序之外的任何延遲載入的庫進行 API 呼叫

為了避免在初始化期間延遲載入庫,您可以對函數處理常式之外的任何延遲載入的庫進行虛擬 API 呼叫。這些虛擬呼叫會初始化庫並預熱您正在使用的 SDK。

**注意:**如果 Lambda 沒有成功 API 呼叫所需的資訊,則對延遲載入的庫的虛擬呼叫可能會失敗。如果呼叫失敗,請確保您發現錯誤。

減少 Lambda 程式碼中的反射操作

反射操作的效能比非反射同類產品更慢。避免在經常呼叫的程式碼區段中進行反射操作。

減少應用程式中的類別數量

將部署套件的大小減少至執行階段所需的執行期可減少調用函數所花費的時間。

如需詳細資訊,請參閱使用 AWS Lambda 函數的最佳實務

提前設定 Lambda 函數的組態參數

提前設定函數的組態參數可減少函數的調用和持續時間延遲。如果您未在程式碼中指定組態變數,則 Lambda 需要更多時間來探索函數的預設變數。

如需詳細資訊,請參閱使用 AWS Lambda 函數的最佳實務函數程式碼

AWS Java SDK 2.0 的更新

如需詳細資訊,請參閱調校 AWS Java SDK 2.x 以縮短啟動時間

**注意:**依預設,AWS Java SDK 2.0 包含 Apache HTTP 用戶端Netty HTTP client,以及 Java HTTP URL 連線用戶端。如果您的使用案例不需要 Apache 和 Netty HTTP 用戶端,則最佳實務是將這些用戶端從部署套件中移除。


AWS 官方
AWS 官方已更新 3 年前