全部產品
Search
文件中心

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

更新時間:Jul 06, 2024

Function Compute在執行個體中調用您的函數,該執行個體提供一個安全和隔離的運行時環境。Function Compute基於執行個體生命週期增加多種回調操作,有效解決傳統應用遷移至Serverless架構時遇到的指標資料延遲或丟失等痛點。本文介紹函數執行個體生命週期、如何配置執行個體周期回呼函數及回呼函數日誌查詢。

執行個體生命週期介紹

image.png

如上圖所示,Function Compute的執行個體生命週期可分為構建階段(Creating)、調用階段(Invoke)和銷毀階段(Destroy)。

  • 構建階段(Creating)

    在構建階段,Function Compute會按照順序執行三項任務:

    • 執行個體建立(Instance Create)

    • 運行時初始化(Runtime Initialization)

    • 運行函數配置的Init回調方法(Init Hook)

    當您使用預留模式時,Function Compute會在您設定預留執行個體後,立即啟動函數執行個體並執行Creating流程。此時可能還沒有函數調用,因此運行時初始化、Init回調和調用階段之間可能會存在較長時間的間隔。

    當您使用按量模式時,Function Compute在收到請求出發後,立即執行Creating初始化流程,如果函數有配置Init回調方法,會先執行完Init回調後再執行Invoke流程。

    對一個函數執行個體,函數配置的Init回調方法只會執行一次,如果執行失敗,會重新啟動一個函數執行個體執行Init流程,Init回調失敗的執行個體會直接銷毀。

  • 調用階段(Invoke)

    在調用階段,Function Compute支援的標準運行時,一個執行個體在同一時間只會執行一個請求。自訂運行時或自訂容器運行時,一個執行個體在同一時間可以執行多個請求。您可以通過設定單一實例多並發實現,具體操作,請參見設定執行個體並發度

  • 銷毀階段(Destroy)

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

執行個體凍結機制

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

image.png

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

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

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

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

說明

當您使用預留執行個體,且沒有開啟閑置計費功能時,執行個體不會進行凍結操作。

使用限制

  • 所有運行時均支援Initialize和PreStop回調方法。

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

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

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

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

前提條件

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

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

說明

喚起PreStop中產生的費用計費方式與InvokeFunction計費方式一致。具體資訊,請參見計費說明

通過控制台配置回調

當您使用控制台建立函數時,Function Compute不支援您PreStop回調,您需要在更新函數時配置該回呼函數。

  1. 登入Function Compute控制台,在左側導覽列,單擊函數

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

  3. 在函數詳情頁,選擇配置頁簽,然後在左側導覽列,選擇生命週期,然後單擊編輯

  4. 在編輯生命週期面板,設定回調程式和回調逾時時間,然後單擊確定

    image.png

    說明

    每一個擴充函數都需要配置單獨的回調程式和逾時時間,其中回調程式格式為[檔案名稱].[擴充函數名]。例如在Python Runtime中,建立函數時指定的PreStop回調為index.preStop,那麼檔案名稱為index.py,PreStop函數名為preStop

  5. 配置回呼函數後,您需要在代碼執行中實現對應的函數。

    1. 單擊代碼頁簽,在代碼編輯地區,輸入擴充函數代碼。

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

      說明

      線上IDE支援PHP、Python、Node.js和Custom Runtime;但不支援Java、Go和.NET這類編譯性語言,以及Custom Container。

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

通過Serverless Devs配置回調

使用Serverless Devs配置PreStop擴充函數時,s.yaml設定檔範例程式碼片段如下所示:

  codeUri: './code.zip'
  ......
  instanceLifecycleConfig:
    preStop:
      handler: index.PreStop
      timeout: 60

如果您需要關閉某個擴充函數,需要將擴充函數的handler參數顯示置空,否則後端預設不更新。例如關閉PreStop函數,您需要按照以下配置進行部署更新,此時PreStop函數的timeout參數已無效。

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

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

通過SDK配置回調

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

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

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

    其中您可以在執行個體生命週期函數配置instanceLifecycleConfig欄位配置PreStop回調。

    image

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

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

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

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

運行時

描述

參考文檔

Node.js

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

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

Python

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

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

PHP

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

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

Java

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

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

C#

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

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

Go

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

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

Custom Runtime

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

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

Custom Container

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

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

查詢回呼函數相關日誌

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

  1. 登入Function Compute控制台,在左側導覽列,單擊函數

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

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

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

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

計費說明

執行個體生命週期回調方法的請求數不計費。其他費用與執行個體調用階段的計費邏輯相同。計費時間的統計如下圖所示

image.png

關於計費方式的具體資訊,請參見計費概述