全部產品
Search
文件中心

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

更新時間:Dec 12, 2024

本文介紹自訂運行時實現函數執行個體生命週期回調的方法。

背景資訊

當您實現並配置函數執行個體生命週期回調後,Function Compute將在相關執行個體生命週期事件發生時調用對應的回調程式。函數執行個體生命週期涉及Initializer和PreStop回調。更多資訊,請參見配置執行個體生命週期

函數執行個體生命週期回調程式與正常調用請求計費規則一致,但其執行日誌只能在函數日誌即時日誌進階日誌中查詢,調用請求列表不會展示回調程式日誌。具體操作,請參見查看執行個體生命週期回呼函數日誌

回調方法實現

Function Compute會在相關執行個體生命週期事件發生時調用對應的回調程式。函數執行個體生命週期涉及Initializer和PreStop回調。

Path

輸入請求

期望的響應

(可選)POST /initialize

請求體:無。

要求標頭:Common Request Headers。具體資訊,請參見Function Compute公用要求標頭

響應體:函數Initializer的傳回值。

StatusCode

  • 2xx:成功狀態。

  • 非2xx:失敗狀態。

(可選)GET /pre-stop

響應體:函數PreStop的傳回值。

StatusCode

  • 2xx:成功狀態。

  • 非2xx:失敗狀態。

這裡以自訂運行時Python 3.10為例,為您介紹自訂運行時生命週期回調方法,具體樣本程式如下所示。

import os
from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/initialize', methods=['POST'])
def init_invoke():
    rid = request.headers.get('x-fc-request-id')
    print("FC Initialize Start RequestId: " + rid)
    # do your things
    print("FC Initialize End RequestId: " + rid)
    return "OK"

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
    rid = request.headers.get('x-fc-request-id')
    print("FC invoke Start RequestId: " + rid)
    # do your things
    print("FC invoke End RequestId: " + rid)
    return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]


@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
    rid = request.headers.get('x-fc-request-id')
    print("FC PreStop Start RequestId: " + rid)
    # do your things
    print("FC PreStop End RequestId: " + rid)
    return "OK"


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000)

除了上面正確的代碼程式,Python語言中還有函數執行報錯的情境,/initialize範例程式碼如下。

@app.route('/initialize', methods=['POST'])
def init():
    raise Exception("hahaha")
    return "OK", 200, []
@app.route('/initialize', methods=['POST'])
def init():
    return "OK", 404, []

如果您想在自訂運行時中使用Initializer回調方法,您只需在您的HTTP Server中實現Path為/initialize和Method為POST的對應邏輯即可。範例程式碼,請參見上表中關於initialize的範例程式碼。

重要

如果建立的函數不設定Initializer,就無需實現/initialize。此時,即使HTTP Server實現了/initialize,代碼中的/initialize邏輯也無法被調用執行。

PreStop回調方法的使用,同Initializer回調方法。

回調錯誤碼

錯誤碼ID

解釋說明

400

  • 函數Initializer回調失敗返回400或404,不會重新發送請求,但系統會繼續重試直到調用成功為止。

  • 函數PreStop回調失敗返回400或404,不會影響函數執行個體的冷凍和停止。

404

500

Function Compute重啟執行個體。

配置生命週期回呼函數

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

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

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

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

    image

  5. 配置回呼函數之後,您需要在代碼執行中實現對應的函數,單擊代碼編輯器上方的部署代碼,然後單擊測試函數

查看執行個體生命週期回呼函數日誌

您可以通過函數日誌功能查看回呼函數日誌。

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

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

  3. 在函數詳情頁面,選擇測試頁簽,單擊測試函數,然後選擇日誌 > 函數日誌

    函數日誌頁簽,您可以查看函數的調用日誌和Initializer回調日誌,樣本如下。

    2024-06-26 10:59:23FC Initialize Start RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
    2024-06-26 10:59:23FC Initialize End RequestId: 529eab23-9b3a-4ffc-88c8-9a686*******
    2024-06-26 10:59:25FC Invoke Start RequestId: 1-667b840c-15c49df0-b7dc1*******
    2024-06-26 10:59:25FC Invoke End RequestId: 1-667b840c-15c49df0-b7dc1*******

    因為每個函數執行個體會緩衝一段時間,不會馬上銷毀,因此不能立即查看PreStop回調日誌。如需快速觸發PreStop回調,可更新函數配置或者函數代碼。更新完成後,再次查看函數日誌,您可以查看PreStop回調日誌。樣本如下。

    2024-06-26 11:04:33FC PreStop Start RequestId: c4385899-f071-490e-a8b7-e33c5*******
    2024-06-26 11:04:33FC PreStop End RequestId: c4385899-f071-490e-a8b7-e33c5*******