本文介绍Custom Container实现函数实例生命周期回调的方法。
背景信息
当您实现并配置函数实例生命周期回调后,函数计算将在相关实例生命周期事件发生时调用对应的回调程序。函数实例生命周期涉及Initializer和PreStop回调。更多信息,请参见配置实例生命周期。
函数实例生命周期回调程序与正常调用请求计费规则一致,但其执行日志只能在函数日志、实时日志或高级日志中查询,调用请求列表不会展示回调程序日志。具体操作,请参见查看实例生命周期回调函数日志。
回调方法实现
函数计算会在相关实例生命周期事件发生时调用对应的回调程序。函数实例生命周期涉及Initializer和PreStop回调。
Path | 输入请求 | 期望的响应 |
(可选)POST | 请求体:无。 请求头:Common Request Headers。具体信息,请参见函数计算公共请求头。 | 响应体:函数 StatusCode
|
(可选)GET |
| 响应体:函数PreStop的返回值。 StatusCode
|
这里以自定义运行时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 |
|
404 | |
500 | 函数计算重启实例。 |
配置生命周期回调函数
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数详情页,选择配置页签,然后在左侧导航栏,选择生命周期,然后单击编辑。
在编辑生命周期面板,设置回调程序和回调超时时间,然后单击部署。
配置回调函数之后,您需要在代码执行中实现对应的函数,单击代码编辑器上方的部署代码,然后单击测试函数。
查看实例生命周期回调函数日志
您可以通过函数日志功能查看回调函数日志。
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数详情页面,选择测试页签,单击测试函数,然后选择 。
在函数日志页签,您可以查看函数的调用日志和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*******