函数实例生命周期回调

本文介绍Custom Container实现函数实例生命周期回调的方法。

背景信息

当您实现并配置函数实例生命周期回调后,函数计算将在相关实例生命周期事件发生时调用对应的回调程序。函数实例生命周期涉及Initializer和PreStop回调。更多信息,请参见配置实例生命周期

函数实例生命周期回调程序与正常调用请求计费规则一致,但其执行日志只能在函数日志实时日志高级日志中查询,调用请求列表不会展示回调程序日志。具体操作,请参见查看实例生命周期回调函数日志

回调方法实现

函数计算会在相关实例生命周期事件发生时调用对应的回调程序。函数实例生命周期涉及Initializer和PreStop回调。

Path

输入请求

期望的响应

(可选)POST /initialize

请求体:无。

请求头:Common Request Headers。具体信息,请参见函数计算公共请求头

响应体:函数Initializer的返回值。

StatusCode

  • 2xx:成功状态。

  • 非2xx:失败状态。

(可选)GET /pre-stop

响应体:函数PreStop的返回值。

StatusCode

  • 2xx:成功状态。

  • 非2xx:失败状态。

这里以自定义运行时Python 3.10为例,为您介绍Custom Container生命周期回调方法,具体示例程序如下所示。

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, []

如果您想在Custom Container使用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

函数计算重启实例。

配置生命周期回调函数

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。

  3. 在函数详情页,选择配置页签,然后在左侧导航栏,选择生命周期,然后单击编辑

  4. 在编辑生命周期面板,设置回调程序和回调超时时间,然后单击部署

    image

  5. 配置回调函数之后,您需要在代码执行中实现对应的函数,单击代码编辑器上方的部署代码,然后单击测试函数

查看实例生命周期回调函数日志

您可以通过函数日志功能查看回调函数日志。

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  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*******