本文介紹函數執行個體健全狀態檢查的背景資訊、使用限制和健全狀態檢查的行為,以及如何在Function Compute控制台設定函數執行個體的健全狀態檢查策略。
背景資訊
選擇使用自訂運行時建立方式建立函數或選擇使用容器鏡像建立方式建立函數且選擇您自己的容器鏡像作為函數運行環境時,您的自訂運行環境可能出現不穩定的情況,導致函數執行個體工作異常。這種情況下,Function Compute支援為函數執行個體設定周期性健全狀態檢查,避免請求訊息被分配至異常執行個體而導致請求失敗。
使用限制
僅支援為自訂運行時環境和使用自訂鏡像啟動的函數執行個體設定健全狀態檢查功能。
健全狀態檢查的行為
執行個體啟動行為
如果您為函數配置了健全狀態檢查,執行個體啟動的行為如下。
- 如果函數定義了初始化回調程式Initializer,則先執行Initializer。否則,直接進行首次健全狀態檢查。
- 如果首次健全狀態檢查成功,則認為執行個體健康,並進入健全狀態檢查迴圈,執行循環性健全狀態檢查,具體流程如下。否則,認為執行個體啟動失敗,健全狀態檢查流程終止,並返回相關錯誤資訊。
- 如果連續健全狀態檢查失敗,次數達到您設定的最大失敗次數,則認為該函數執行個體不健康。Function Compute將嘗試調度請求到其他執行個體。
- 如果不健康的執行個體連續健全狀態檢查成功,次數達到您設定的探測成功閾值,則認為該執行個體已恢複健康。
關於探測成功閾值和最大失敗次數的設定,請參見使用控制台為函數執行個體設定健全狀態檢查。
單次健全狀態檢查行為
Function Compute執行一次健全狀態檢查的行為如下。
- 根據函數配置,向指定HTTP路徑發送GET請求。
- 如果GET請求執行沒有逾時,HTTP返回狀態代碼小於400且大於等於200,則認為本次檢查成功。否則,認為本次檢查失敗。
健全狀態檢查失敗後的調度行為
如果函數執行個體不健康,Function Compute將嘗試調度請求到其他執行個體。
- 如果Function Compute調度請求成功,請求將在新的函數執行個體上執行。
- 如果Function Compute未能及時調度請求到其他執行個體,將返回健全狀態檢查失敗錯誤資訊。下一次執行健全狀態檢查時,會直接調度到新的函數執行個體。
使用控制台為函數執行個體設定健全狀態檢查
本文以選擇使用自訂運行時建立方式建立一個運行環境為Node.js 14,請求處理常式類型為處理事件請求的函數為例,介紹如何為函數的執行個體配置健全狀態檢查功能。
步驟一:建立函數
- 登入Function Compute控制台,在左側導覽列,單擊服務及函數。
- 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊建立函數。
- 在建立函數頁面,選擇使用自訂運行時建立,按需設定配置項,然後單擊建立。配置項說明如下,其餘配置項保持預設值。
配置項 說明 函數名稱 自訂函數名稱。 請求處理常式類型 選擇處理事件請求處理序類型。 運行環境 選擇Node.js 14。 - 在函數詳情頁面,選擇函數代碼頁簽,在代碼編輯器內編輯函數代碼,然後部署代碼並執行函數。
index.js程式碼範例如下。'use strict'; // Constants const PORT = 9000; const HOST = '0.0.0.0'; const REQUEST_ID_HEADER = 'x-fc-request-id' const express = require('express'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(bodyParser.raw()); app.get('/readyz', (req, res) => { console.log(`receive health check`); res.status(200); console.log(`i am ready`); res.send('i am ready\n'); }); // invocation app.post('/invoke', (req, res) => { var rid = req.headers[REQUEST_ID_HEADER] console.log(`FC Invoke Start RequestId: ${rid}`) res.send('OK'); console.log(`FC Invoke End RequestId: ${rid}`) }); var server = app.listen(PORT, HOST); console.log(`Running on http://${HOST}:${PORT}`); server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeout上述代碼中,
readyz為定義的健全狀態檢查的Handler,用於處理/readyz路徑下的HTTP GET請求。完成步驟二的操作後,您可以配置周期性執行此Handler,持續檢查執行個體是否正常。當Function Compute判定您的函數執行個體異常時,將嘗試將請求調度到其他正常的執行個體。如果Function Compute調度失敗,會返回健全狀態檢查失敗相關的報錯資訊。
例如,將上方範例程式碼的健全狀態檢查部分替換為以下樣本,將總是返回500錯誤碼。app.get('/readyz', (req, res) => { console.log(`receive health check`); res.status(500); console.log(`i am not ready`); res.send('i am not ready\n'); });再次執行函數,返回的資訊如下。{ "ErrorCode": "FunctionNotStarted", "ErrorMessage": "check function health failed with status code: 500 " }
步驟二:為函數執行個體設定健全狀態檢查
- 登入Function Compute控制台,在左側導覽列,單擊服務及函數。
- 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊目標函數操作列的配置。
- 在編輯函數配置頁面的HealthCheck 配置地區,按需設定以下配置項,然後單擊儲存。
配置項 說明 健全狀態檢查 是否開啟對執行個體進行健全狀態檢查的功能。如果選擇啟用,您需要設定下面的配置項。 請求路徑 健全狀態檢查的HTTP Get請求的路徑,Function Compute向此路徑發送HTTP Get請求做健全狀態檢查。取值必須以/開頭。 首次探測延遲時間 首次健全狀態檢查之前,延遲等待的時間。 探測時間間隔 發送HTTP GET請求的周期。 探測逾時時間 HTTP GET請求逾時的時間,超過設定的該值,則認為請求失敗。 最大失敗次數 HTTP GET請求失敗閾值。健全狀態檢查迴圈執行期間,HTTP GET請求連續失敗次數達到設定的該值時,健全狀態檢查狀態被判定為檢查失敗。 探測成功閾值 HTTP GET請求成功閾值。健全狀態檢查迴圈執行期間,HTTP GET請求連續成功次數達到設定的該值後,健全狀態檢查狀態被判定為檢查成功。
更多資訊
除控制台外,Function Compute還支援調用API配置執行個體的健全狀態檢查功能。更多資訊,請參見: