本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
了解 Lambda 受管執行個體執行環境
Lambda 受管執行個體提供替代部署模型,可在客戶擁有的 Amazon EC2 執行個體上執行函數程式碼,同時 Lambda 管理操作層面。受管執行個體的執行環境與 Lambda (預設) 函數有幾項重要的差異,特別是在處理並行調用和管理容器生命週期方面。
注意:如需 Lambda (預設) 執行環境的相關資訊,請參閱了解 Lambda 執行環境生命週期。
執行環境生命週期
Lambda 受管執行個體函數執行環境的生命週期與 Lambda (預設) 有幾個關鍵方面不同:
初始化階段
在初始化階段,Lambda 會執行下列步驟:
-
初始化並註冊所有擴充功能
-
引導執行時間進入點。執行時間會產生設定的執行時間工作者數量 (實作取決於執行時間)
-
執行函數初始化程式碼 (處理常式外部的程式碼)
-
呼叫 ,等待至少一個執行階段工作者發出整備訊號
/runtime/invocation/next
當延伸項目已初始化且至少有一個執行階段工作者已呼叫 時,初始化階段會被視為完成/runtime/invocation/next。然後,該函數已準備好處理調用。
注意
對於 Lambda 受管執行個體函數,初始化最多可能需要 15 分鐘。逾時是最多 130 秒或設定的函數逾時 (最多 900 秒)。
調用階段
Lambda 受管執行個體函數的調用階段具有數種獨特特性:
持續操作。與 Lambda (預設) 不同,執行環境會持續作用中,在呼叫到達時處理呼叫,而不會在呼叫之間凍結。
平行處理。多個調用可以在相同的執行環境中同時執行,每個環境都由不同的執行時間工作者處理。
獨立逾時。函數設定的逾時會套用至每個個別叫用。當調用逾時時,Lambda 會將該特定調用標記為失敗,但不會中斷其他執行中的調用或終止執行環境。
背壓處理。如果所有執行時間工作者都忙於處理調用,則新的調用請求會被拒絕,直到工作者可用為止。
錯誤處理和復原
Lambda 受管執行個體函數執行環境中的錯誤處理與 Lambda 不同 (預設):
執行期工作者失敗。如果執行期工作者程序當機,執行環境會繼續與其餘運作狀態良好的工作者一起運作。
延伸模組當機。如果延伸程序在初始化或操作期間當機,整個執行環境會標示為運作狀態不佳並終止。Lambda 會建立新的執行環境來取代它。
不重設/修復。與 Lambda (預設) 不同,受管執行個體不會嘗試在發生錯誤後重設並重新初始化執行環境。相反地,運作狀態不佳的容器會終止,並以新的容器取代。
叫用逾時
當個別調用逾時時,Lambda 會將狀態為函數錯誤的Task timed out after <timeout> seconds錯誤傳回給發起人。不過,Lambda 受管執行個體不會強制終止您的程式碼,它會繼續在執行環境中執行。身為函數開發人員,您必須負責偵測和處理逾時。內容物件會公開呼叫的剩餘時間。零或負值表示調用已逾時。執行環境中的其他並行調用會繼續正常處理。
重試行為
當呼叫逾時時:
-
同步調用:發起人收到逾時錯誤並負責重試。
-
非同步叫用:Lambda 會根據函數的重試政策重試 (預設:2 次重試)。所有重試都用盡之後,事件會傳送至設定的無效字母佇列或失敗時目的地,如果有的話。
-
事件來源映射:重試行為取決於事件來源組態 (例如,批次大小、錯誤分類、重試嘗試次數上限)。批次可能會根據您的重試政策重試或傳送至失敗時的目的地。
如果您不處理逾時會發生什麼情況
如果您的程式碼未檢查剩餘時間並停止執行:
-
調用已標記為失敗。Lambda 已將逾時錯誤傳回給發起人,您的程式碼在逾時從發起人的觀點有效地遺失之後完成的任何工作。
-
資源仍會耗用。您的程式碼會繼續佔用執行時間工作者插槽,減少該執行個體上新調用可用的並行。
-
非確定性行為。當逾時觸發時,您的程式碼不會停止,它會在背景中持續執行。這表示在 Lambda 已告知發起人調用失敗之後,仍然可能發生副作用。例如,您的處理常式會將記錄寫入 DynamoDB,然後逾時會觸發,Lambda 會傳回逾時錯誤給發起人,但您的程式碼仍在執行中並繼續傳送 SNS 通知。發起人會重試呼叫,這會再次寫入記錄並再次傳送通知。您現在有重複的資料和重複的通知,而且無法輕易得知哪些資料來自仍在背景中執行的「失敗」調用。
處理程式碼中的逾時
使用內容物件來檢查剩餘時間,並在逾時之前停止處理。根據下一個工作單位的預期持續時間設定緩衝區,例如,如果每個項目需要大約 500 毫秒來處理,請將緩衝區設定為至少 500 毫秒加上邊界。
如需逾時處理的語言特定範例,請參閱每個執行時間頁面的請求內容區段: