本文介绍函数实例健康检查的背景信息、使用限制和健康检查的行为,以及如何在函数计算控制台设置函数实例的健康检查策略。
背景信息
自定义运行时和自定义容器镜像可能出现不稳定的情况,导致函数实例工作异常。这种情况下,函数计算支持为函数实例设置周期性健康检查,避免请求消息被分配至异常实例而导致请求失败。
使用限制
仅Web 函数和GPU函数支持设置健康检查功能。
健康检查的行为
实例启动行为
如果您为函数配置了健康检查,实例启动的行为如下。
- 如果函数定义了初始化回调程序Initializer,则先执行Initializer。否则,直接进行首次健康检查。 
- 如果首次健康检查成功,则认为实例健康,并进入健康检查循环,执行周期性健康检查,具体流程如下。否则,认为实例启动失败,健康检查流程终止,并返回相关错误信息。 - 如果连续健康检查失败,次数达到您设置的最大失败次数,则认为该函数实例不健康。函数计算将尝试调度请求到其他实例。 
- 如果不健康的实例连续健康检查成功,次数达到您设置的探测成功阈值,则认为该实例已恢复健康。 
 
关于探测成功阈值和最大失败次数的设置,请参见使用控制台为函数实例设置健康检查。
单次健康检查行为
函数计算执行一次健康检查的行为如下。
- 根据函数配置,向指定HTTP路径发送GET请求。 
- 如果GET请求执行没有超时,HTTP返回状态码小于400且大于等于200,则认为本次检查成功。否则,认为本次检查失败。 
健康检查失败后的调度行为
如果函数实例不健康,函数计算将尝试调度请求到其他实例。
- 如果函数计算调度请求成功,请求将在新的函数实例上执行。 
- 如果函数计算未能及时调度请求到其他实例,将返回健康检查失败错误信息。下一次执行健康检查时,会直接调度到新的函数实例。 
使用控制台为函数实例设置健康检查
本文以选择Web 函数方式创建一个运行环境为Node.js 18的函数为例,介绍如何为函数的实例配置健康检查功能。
步骤一:创建函数
- 登录函数计算控制台,在左侧导航栏,选择。 
- 在顶部菜单栏,选择地域,然后在函数列表页面,单击创建函数。 
- 在创建函数页面,选择Web函数,运行环境选择,然后单击创建。 
- 在函数详情页面,选择代码页签,在代码编辑器内编辑函数代码,单击部署代码。 - 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,持续检查实例是否正常。- 当函数计算判定您的函数实例异常时,将尝试将请求调度到其他正常的实例。如果函数计算调度失败,会返回健康检查失败相关的报错信息。 
步骤二:为函数实例设置健康检查
- 登录函数计算控制台,在左侧导航栏,选择。 
- 在顶部菜单栏,选择地域,然后在函数页面,单击上一步创建的函数。 
- 在函数详情页面,选择配置页签,单击高级配置右侧的编辑,在高级配置面板,开启健康检查开关,然后按照以下操作完成配置后单击部署。 - 配置项 - 说明 - 请求路径 - 健康检查HTTP GET请求的路径,函数计算向此路径发送HTTP GET请求做健康检查。取值必须以 - /开头。- 首次探测延迟时间 - 首次健康检查之前,延迟等待的时间。 - 探测时间间隔 - 发送HTTP GET请求的周期。 - 探测超时时间 - HTTP GET请求超时的时间,超过设置的该值,则认为请求失败。 - 最大失败次数 - HTTP GET请求失败阈值。健康检查循环执行期间,HTTP GET请求连续失败次数达到设置的该值时,健康检查状态被判定为检查失败。 - 探测成功阈值 - HTTP GET请求成功阈值。健康检查循环执行期间,HTTP GET请求连续成功次数达到设置的该值后,健康检查状态被判定为检查成功。 
步骤三:验证健康检查配置情况
- 在函数配置页面,选择代码页签,单击测试函数,查看函数运行结果。 - 步骤一的代码示例,函数实例健康检查正常,返回结果为OK。 
- 修改代码中的健康检查部分为下面的代码,然后单击部署代码,代码部署成功后,再次单击测试函数,查看函数运行结果。 - 修改后的代码内容如下。 - 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'); });- 函数实例健康检查将返回500错误,再次执行函数,返回的信息如下。 - { "RequestId": "1-65081d42-e4895cbc7d6252bda643****", "Code": "FunctionNotStarted", "Message": "The function http server cannot be started. check function health failed with status code: 500 " }
更多信息
除控制台外,函数计算还支持调用API配置实例的健康检查功能。更多信息,请参见:更新函数配置健康检查。