全部產品
Search
文件中心

Function Compute:配置執行個體生命週期

更新時間:Sep 29, 2025

Function Compute在處理使用者請求時,自動分配一個或多個執行個體,每個執行個體提供一個安全和隔離的運行時環境。傳統應用遷移至Serverless架構時,由於函數執行個體的建立和銷毀具有瞬態性,可能導致監控資料更新不及時、指標資料延遲或丟失等問題,為瞭解決以上痛點,Function Compute基於執行個體生命週期增加多種回調操作,確保監控資料的即時性和完整性。

函數執行個體的生命週期

函數執行個體會根據函數當前的請求調用量動態地按需構建與銷毀,每個函數執行個體的生命週期包括執行個體構建(Creating)請求調用(Invoke)執行個體銷毀(Destroy)三個階段,如下圖所示。

執行個體構建(Creating)

執行個體構建是指Function Compute根據您的函數配置為您建立函數執行個體。在執行個體構建階段,Function Compute會按照順序執行以下三項任務:

  1. 執行個體建立(Instance Create),包括載入代碼、層載入或拉取鏡像和啟動執行個體。

  2. 運行時啟動(Runtime Init)。

  3. 執行函數配置的Initializer回調(Init Hook)。更多資訊,請參見Initializer回調

執行個體構建階段示意圖如下所示。

執行個體構建一般在以下兩種情況下發生。

  • 彈性擴容

    收到調用請求時,若當前的函數執行個體已經滿載,會構建新的執行個體來處理請求,並立即執行執行個體構建流程,緊接著就會執行請求調用流程。彈性擴容可能會造成冷啟動,解決方案請參見Function Compute冷啟動最佳化最佳實務

  • 最小執行個體數調整

    如果函數設定的最小執行個體數由0變更為≥1的其他值,Function Compute會立即啟動執行個體構建流程。如果當前未收到調用請求,則後續的請求調用流程會與執行個體構建流程相隔較長時間。更多資訊,請參見配置最小執行個體數彈性策略

請求調用(Invoke)

執行個體運行期間,會調用您的函數處理常式以處理來自內外部的函數調用請求。在調用階段,對於Function Compute支援的內建運行時,一個執行個體在同一時間只會處理一個請求;對於自訂運行時或自訂容器運行時,一個執行個體在同一時間可以處理多個請求。您可以通過設定單一實例多並發實現,具體操作,請參見配置單一實例並發度

Function Compute只在實際請求和回調程式執行時計費,在請求以外的時間段內執行個體會被冷凍,因此不計費,詳情請參見計費說明

執行個體銷毀(Destroy)

如果函數執行個體在一段時間內沒有收到任何調用,則觸發此階段。在銷毀階段,Function Compute會先執行PreStop回調方法。您可以在PreStop回調方法中執行一些清理任務。

執行個體銷毀一般在以下三種情況下發生。

  • 執行個體閑置:如果執行個體在一段時間內沒有收到任何調用請求,Function Compute會自動回收該執行個體。

  • 最小執行個體數調整:當您縮容最小執行個體數時,Function Compute會立即為您銷毀多餘的執行個體。

  • 執行個體異常:如果執行個體在構建或運行階段出現了異常,Function Compute會銷毀該執行個體。

執行個體凍結機制

在沒有調用請求時,Function Compute會將執行個體凍結(Freeze)當新的請求來到時,Function Compute會將執行個體解凍(Thaw)。如下圖所示。

執行個體凍結主要發生在以下兩種情況。

  • 執行個體初始化階段完成後,調用階段前。

  • 函數某一次調用階段結束後,下一次調用階段前。

在一次調用階段完成後,Function Compute將凍結函數執行個體,程式中的後台進程、線程或協程無法繼續運行,非同步日誌也可能沒有寫入成功。

使用限制

  • 針對GPU函數,Initialize回調程式支援調用代碼執行指令兩種類型,兩種類型不允許同時配置,同時只能有一個生效。

  • 針對事件函數、Web函數和任務函數,Initialize回調程式僅支援調用代碼類型,系統預設啟用該模式,無需手動選擇。

  • PreStop回調程式僅支援調用代碼類型,且所有運行時均支援PreStop回調程式.

  • PreStop回調方法的輸入參數沒有event參數。

  • PreStop回呼函數無傳回值,在函數末尾增加返回邏輯無效。

  • 如果使用Java Runtime,您需要將fc-java-core更新至1.4.0及以上版本,否則無法使用PreStop回呼函數。

  • 當函數執行返回時,Function Compute將凍結函數執行個體,使用者不可假設調用返回時所有非同步進程、線程、協程等執行完成,也不可假設本次非同步寫入的日誌被重新整理。

  • 對於調用代碼類型的回調程式,不同運行時的配置方式不同。針對內建運行時,配置生命週期回調時,需要自訂回調程式入口,例如配置Initializer回調程式為index.initialize,此時需要在代碼中增加initialize回呼函數。針對自訂運行時和自訂鏡像,配置調用Initializer和PreStop回調程式後,函數執行個體啟動或停止時,系統會向您的函數發送HTTP請求POST /initialize或GET /pre-stop,您需要在業務代碼中響應該請求。

計費說明

執行個體生命週期回調方法的請求數不計費,其他費用與執行個體調用階段的計費邏輯相同。計費時間長度的統計如下圖所示。關於計費方式的具體資訊,請參見計費概述

前提條件

已完成函數的建立,具體請參見建立函數

配置執行個體生命週期回調方法

通過控制台配置回調

  1. 登入Function Compute控制台,在左側導覽列,選擇函數管理 > 函數列表

  2. 在頂部功能表列,選擇地區,然後在函數列表頁面,單擊目標函數。

  3. 在函數詳情頁,選擇配置頁簽,然後單擊執行個體配置地區右側的編輯

  4. 執行個體配置面板,設定Initializer回調程式和回調逾時時間。

    本文以GPU函數配置Initializer回調程式為例進行說明,事件函數、Web函數和任務函數的Initialize回調程式僅支援調用代碼類型,可參考本文介紹的調用代碼類型相關操作。

    • 選擇調用代碼類型

      image

    • 選擇執行指令類型

      image

  5. 執行個體配置面板,繼續設定PreStop回調程式和回調逾時時間,然後單擊部署

  6. 如果配置了調用代碼類型的Initializer回調或PreStop回調,您需要在代碼執行中實現對應的函數。

    1. 單擊代碼頁簽,在代碼編輯地區,增加回調程式函數邏輯。

      例如,您配置的PreStop回調程式為index.preStop,則需要實現preStop函數。不同語言運行時實現函數執行個體生命週期回調的方法請參見函數執行個體生命週期回調方法

      說明

      線上IDE支援PHP、Python、Node.js和自訂運行時;但不支援Java、Go和.NET這類編譯性語言,以及自訂鏡像。

    2. 單擊代碼編輯器上方的部署代碼,然後單擊測試函數

通過Serverless Devs配置回調

使用Serverless Devs配置initializer回調程式時,s.yaml設定檔範例程式碼片段如下所示:

  codeUri: './code.zip'
  ......
  instanceLifecycleConfig:
    initializer:
      timeout: 60
      command:
        - /bin/sh
        - -c
        - echo "hello"

如果您需要關閉某個回調程式,需要將回呼函數的handler參數以及command顯示置空,否則後端預設不更新。例如關閉initializer回調程式時,您需要按照以下配置進行部署更新,此時initializer回調程式的逾時時間和執行命令已無效。

  codeUri: './code.zip'
  ......
  instanceLifecycleConfig:
    initializer:
      handler: ""
      timeout: 60
      command: ""

不同語言運行時實現函數執行個體生命週期回調的方法請參見函數執行個體生命週期回調方法

通過SDK配置回調

您可以通過SDK部署和更新回調程式。本文介紹如何擷取在建立函數時配置回呼函數的SDK範例程式碼。

  1. 進入CreateFunction - 建立函數頁面,單擊調試,進入OpenAPI門戶。

  2. 參數配置頁簽,根據需要建立函數的基本資料填寫輸入參數

    說明

    preStop回調暫不支援配置command參數。

    image

  3. 參數配置完成後,單擊SDK 樣本頁簽,擷取對應語言的SDK範例程式碼。

不同語言運行時實現函數執行個體生命週期回調的方法請參見函數執行個體生命週期回調方法

函數執行個體生命週期回調方法

Function Compute中所有運行時均支援Initialize和PreStop兩種回調方法。運行時實現函數執行個體生命週期回調的方法請參考以下內容。

運行時

描述

參考文檔

Node.js

通過Node.js實現並應用函數執行個體生命週期回調方法。

函數執行個體生命週期回調

Python

通過Python實現並應用函數執行個體生命週期回調方法。

函數執行個體生命週期回調

PHP

通過PHP實現並應用函數執行個體生命週期回調方法。

函數執行個體生命週期回調

Java

通過Java運行時實現函數執行個體生命週期回調的方法。

函數執行個體生命週期回調

C#

通過C#運行時實現函數執行個體生命週期回調的方法。

函數執行個體生命週期回調

Go

通過Go實現函數執行個體生命週期回調的方法。

函數執行個體生命週期回調

自訂運行時

通過自訂運行時實現函數執行個體生命週期回調的方法。

函數執行個體生命週期回調

自訂鏡像

通過自訂鏡像運行時實現函數執行個體生命週期回調的方法。

函數執行個體生命週期回調

查詢回呼函數相關日誌

配置函數執行個體生命週期回調並執行代碼實現對應的回呼函數後,您可以查詢執行個體生命週期回呼函數的相關日誌。

說明

目前執行指令類型回調產生的日誌暫不支援寫入函數日誌。

  1. 登入Function Compute控制台,在左側導覽列,選擇函數管理 > 函數列表

  2. 在頂部功能表列,選擇地區,然後在函數列表頁面,單擊目標函數。

  3. 在函數詳情頁,選擇日誌頁簽,然後在調用請求頁簽,單擊目標請求行右側操作列的進階日誌

    您可以使用複製的執行個體ID,查詢所有生命週期回呼函數的Start/End日誌;還可以使用執行個體ID+函數執行個體生命週期回調關鍵字查詢指定回呼函數的Start/End日誌,例如,c-62833f38-20f1629801fa4bd***** and PreStop

    此外,您還可以根據Start/End日誌中的RequestId查詢請求的日誌資訊。如果使用者日誌中沒有RequestId,可以單擊該日誌中的db_lifecycle_log_context表徵圖擷取上下文日誌。