本文介紹函數實例健康檢查的背景信息、使用限制和健康檢查的行為,以及如何在函數計算控制臺設置函數實例的健康檢查策略。

背景信息

選擇使用自定義運行時創建方式創建函數或選擇使用容器鏡像創建方式創建函數且選擇您自己的容器鏡像作為函數運行環境時,您的自定義運行環境可能出現不穩定的情況,導致函數實例工作異常。這種情況下,函數計算支持為函數實例設置周期性健康檢查,避免請求消息被分配至異常實例而導致請求失敗。

使用限制

僅支持為自定義運行時環境和使用自定義鏡像啟動的函數實例設置健康檢查功能。

健康檢查的行為

實例啟動行為

如果您為函數配置了健康檢查,實例啟動的行為如下。
  1. 如果函數定義了初始化回調程序Initializer,則先執行Initializer。否則,直接進行首次健康檢查。
  2. 如果首次健康檢查成功,則認為實例健康,并進入健康檢查循環,執行周期性健康檢查,具體流程如下。否則,認為實例啟動失敗,健康檢查流程終止,并返回相關錯誤信息。
    • 如果連續健康檢查失敗,次數達到您設置的最大失敗次數,則認為該函數實例不健康。函數計算將嘗試調度請求到其他實例。
    • 如果不健康的實例連續健康檢查成功,次數達到您設置的探測成功閾值,則認為該實例已恢復健康。

關于探測成功閾值最大失敗次數的設置,請參見使用控制臺為函數實例設置健康檢查。

單次健康檢查行為

函數計算執行一次健康檢查的行為如下。
  1. 根據函數配置,向指定HTTP路徑發送GET請求。
  2. 如果GET請求執行沒有超時,HTTP返回狀態碼小于400且大于等于200,則認為本次檢查成功。否則,認為本次檢查失敗。

健康檢查失敗后的調度行為

如果函數實例不健康,函數計算將嘗試調度請求到其他實例。
  • 如果函數計算調度請求成功,請求將在新的函數實例上執行。
  • 如果函數計算未能及時調度請求到其他實例,將返回健康檢查失敗錯誤信息。下一次執行健康檢查時,會直接調度到新的函數實例。

使用控制臺為函數實例設置健康檢查

本文以選擇使用自定義運行時創建方式創建一個運行環境為Node.js 14,請求處理程序類型處理事件請求的函數為例,介紹如何為函數的實例配置健康檢查功能。

步驟一:創建函數

  1. 登錄函數計算控制臺,在左側導航欄,單擊服務及函數
  2. 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊創建函數。
  4. 創建函數頁面,選擇使用自定義運行時創建,按需設置配置項,然后單擊創建
    配置項說明如下,其余配置項保持默認值。
    配置項 說明
    函數名稱 自定義函數名稱。
    請求處理程序類型 選擇處理事件請求處理序類型
    運行環境 選擇Node.js 14。
  5. 在函數詳情頁面,選擇函數代碼頁簽,在代碼編輯器內編輯函數代碼,然后部署代碼并執行函數。
    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,持續檢查實例是否正常。

    函數計算判定您的函數實例異常時,將嘗試將請求調度到其他正常的實例。如果函數計算調度失敗,會返回健康檢查失敗相關的報錯信息。

    例如,將上方示例代碼的健康檢查部分替換為以下示例,將總是返回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 "
    }

步驟二:為函數實例設置健康檢查

  1. 登錄函數計算控制臺,在左側導航欄,單擊服務及函數。
  2. 在頂部菜單欄,選擇地域,然后在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊目標函數操作列的配置。
  4. 在編輯函數配置頁面的HealthCheck 配置區域,按需設置以下配置項,然后單擊保存。
    配置項 說明
    健康檢查 是否開啟對實例進行健康檢查的功能。如果選擇啟用,您需要設置下面的配置項。
    請求路徑 健康檢查的HTTP Get請求的路徑,函數計算向此路徑發送HTTP Get請求做健康檢查。取值必須以/開頭。
    首次探測延遲時間 首次健康檢查之前,延遲等待的時間。
    探測時間間隔 發送HTTP GET請求的周期。
    探測超時時間 HTTP GET請求超時的時間,超過設置的該值,則認為請求失敗。
    最大失敗次數 HTTP GET請求失敗閾值。健康檢查循環執行期間,HTTP GET請求連續失敗次數達到設置的該值時,健康檢查狀態被判定為檢查失敗。
    探測成功閾值 HTTP GET請求成功閾值。健康檢查循環執行期間,HTTP GET請求連續成功次數達到設置的該值后,健康檢查狀態被判定為檢查成功。

更多信息

除控制臺外,函數計算還支持調用API配置實例的健康檢查功能。更多信息,請參見: