簡體   English   中英

AWS Lambda - Java 靜態初始化

[英]AWS Lambda - Java static initialization

在 AWS lambda 函數(用 Java 編寫)中,我想使用 AsyncHttpClient( https://github.com/AsyncHttpClient/async-http-client )。 不幸的是,創建這個對象的實例需要大約 500 毫秒。(但我仍然喜歡它,請不要建議我更改 http 客戶端)。

我正在考慮在靜態初始化塊中創建 AsyncHttpClient。 所以它可能會被 AWS 執行一次,然后快照會在每次 AWS Lambda 執行時被克隆。 我對么?

什么時候在 AWS Lambda 中執行靜態塊?

  • 一次快照被克隆到每個 AWS Lambda 調用
  • 或為每個 Lambda 執行分別執行靜態塊(將 Http Client 的創建放在那里無濟於事)

謝謝你的幫助

您的Lambda執行環境從未有過任何快照。 但是,有一個容器重用的概念。 當函數在新容器中首次運行時,將調用靜態初始化塊,並且發送到該容器的每個后續Lambda執行將能夠跳過初始化步驟。 每次Lambda為Lambda函數啟動一個新容器時,都需要再次進行初始化工作。

我建議在AWS博客上閱讀有關Lambda容器重用的文章。

正如Mark B解釋的那樣,沒有“快照”之類的東西。

首次調用您的Lambda時,AWS啟動執行上下文,然后將其重用於下一個請求。 但是,這不能保證。 AWS可以隨時關閉此上下文,或者創建其他文件來擴展Lambda,以防您負擔沉重。

執行上下文由容器,JVM和Java類的Singleton實例組成,其中定義了處理程序函數。

因此,我不建議在靜態塊中進行任何“一次性”初始化,而建議在類的構造函數中進行。 這將大大提高代碼的可測試性。

您可以配置AWS Snapstart ,它將在初始化后保存您的 lambda 的狀態。 我剛剛看到一個簡單的 Java lambda 冷啟動時間減少了 1/6。

來自上面鏈接的 AWS 文檔:“Lambda SnapStart for Java 可以將延遲敏感應用程序的啟動性能提高多達 10 倍,無需額外費用,通常無需更改您的功能代碼。啟動延遲的最大貢獻者(通常稱為冷開始時間)是 Lambda 初始化函數所用的時間,包括加載函數代碼、啟動運行時和初始化函數代碼。

借助 SnapStart,Lambda 會在您發布函數版本時初始化您的函數。 Lambda 獲取初始化執行環境的內存和磁盤狀態的 Firecracker microVM 快照,加密快照,並將其緩存以實現低延遲訪問。 當你第一次調用函數版本時,隨着調用的增加,Lambda 會從緩存的快照中恢復新的執行環境,而不是從頭開始初始化它們,從而改善啟動延遲。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM