配置函数的异步调用策略
在异步调用函数的场景下,FunctionGraph会将请求排队,不等待函数的执行结果,直接向客户端返回响应,这种情况下客户端无法实时感知函数的执行结果。如果需要设置异步请求失败重试或者获取异步请求的结果通知,可以通过设置异步配置实现。
- 失败重试:用户代码异常造成的失败,FunctionGraph默认不重试。如果函数中有需要重试的场景,例如调用三方服务经常失败,可配置重试提升成功率。
- 结果通知:FunctionGraph可以将异步函数的执行结果传递给下游服务做进一步处理。例如把执行失败信息保存到OBS,用于后续分析失败原因,或者把执行成功信息推送到DIS或再次触发函数做处理等。
约束与限制
限制场景 |
具体限制 |
---|---|
使用异步调用的函数 |
使用异步调用的函数,返回值的大小不能超过256KB,否则会返回空值。 |
使用异步配置通知目标服务 |
请务必保证不要出现循环调用的情况。 例如:函数A配置了成功调用时的异步通知目标为函数B,函数B配置了成功调用时的异步通知目标为函数A,当异步触发函数A并且执行成功后,则可能出现A>B>A......循环调用的情况。 |
使用异步配置失败时通知分布式消息服务(RocketMQ) |
仅支持“华东-上海一”、“西南-贵阳一”区域配置。 |
前提条件
- 使用异步配置通知目标服务,需配置具有目标服务操作权限的函数委托,配置函数委托详情请参考配置函数的委托权限。
- 使用异步配置失败时通知分布式消息服务(RocketMQ),需要配置函数访问VPC且与通知的RocketMQ实例在同一个VPC中。
同时,需要确保RocketMQ实例所在的安全组入方向规则已放通实例的连接端口,否则无法通知消息,可参考连接RocketMQ网络要求。(当前处于公测阶段,仅支持华东-上海一、西南-贵阳一。)
配置异步调用策略
- 登录函数工作流控制台,在左侧的导航栏选择“函数 > 函数列表”。
- 单击函数的名称,进入函数详情页。
- 在“设置”页签下选择“异步配置”。
- 在异步配置页面,单击“配置异步调用”,编辑异步配置信息。
图1 填写配置参数
表2 异步配置参数说明 参数
说明
异步策略配置
- 最大重试次数:异步调用失败后最大重试次数,默认为3次,取值范围:0-3。
- 消息最大有效期(s):消息最大存活时长,取值范围:1-86400秒。
- 开启异步调用状态持久化:开通云日志服务(LTS)后显示该配置开关,具体配置方式请参考配置异步调用状态持久化。
成功时通知
目标服务:函数执行成功时发送通知到以下目标服务。
失败时通知
目标服务:函数执行失败时发送通知到以下目标服务。
- 函数工作流(FunctionGraph)
- 函数名称:选择接收通知消息的函数名称。
- 版本/别名:选择函数对应的版本或别名。
- 对象存储服务(OBS)
- 目标桶目录:选择存放通知消息的OBS桶路径。
- 对象前缀目录:输入对象前缀目录,以筛选通知消息要存放的对象文件。
- 对象过期时间(天):过期后的对象会被OBS服务端自动清理。单位:天,取值范围:0-365,0表示不过期。
- 数据接入服务(DIS)
- 消息通知服务(SMN)
- 分布式消息服务 RocketMQ版(RocketMQ)(仅支持华东-上海一、西南-贵阳一区域配置。)
- 实例:选择接收通知消息的RocketMQ实例。
- Topic:选择接收通知消息的Topic。
- 单击“确定”保存异步配置。
通知消息结构说明
FunctionGraph向目标发送异步调用通知的消息示例如下所示。
{ "timestamp": "2020-08-20T12:00:00.000Z+08:00", "request_context": { "request_id": "1167bf8c-87b0-43ab-8f5f-26b16c64f252", "function_urn": "urn:fss:xx-xxxx-x:xxxxxxx:function:xxxx:xxxx:latest", "condition": "", "approximate_invoke_count": 0 }, "request_payload": "", "response_context": { "status_code": 200, "function_error": "" }, "response_payload": "hello world!" }
参数 |
说明 |
---|---|
timestamp |
函数开始执行的时间。 |
request_context |
请求上下文。 |
request_context.request_id |
异步调用的请求ID。 |
request_context. function_urn |
异步执行的函数URN。 |
request_context.condition |
调用错误类别。 |
request_context. approximate_invoke_count |
异步调用的执行次数。当该值大于1时,说明函数的执行进行了重试。 |
request_payload |
请求函数的原始负载。 |
response_context |
返回上下文。 |
response_context.statusCode |
调用函数的系统返回码。当该返回码不为200时,说明出现了系统错误。 |
response_context.function_error |
调用错误信息。 |
response_payload |
执行函数返回的原始负载。 |
配置异步调用状态持久化
异步调用状态持久化可以提供更好的可观测性,开启后函数的异步调用日志会上报到LTS,通过日志可以查询每次异步调用的执行状态。
- 登录函数工作流控制台,在左侧的导航栏选择“函数 > 函数列表”。
- 单击函数的名称,进入函数详情页,在“设置”页签下选择“异步配置”。
- (如已开通云日志服务,可跳过该步骤)在异步配置页面,单击页面上方说明信息中的“点击开通”,开通云日志服务(LTS)。
此过程中系统会自动调用LTS接口,在LTS控制台创建日志组(名称为function-async-log-group开头的日志组)和日志流(名称为function-async-log-stream开头的日志流),用户无需手动创建日志组和日志流。
- 开通完成后,在页面上单击“配置异步调用”,页面上新增参数“开启异步调用状态持久化”。
- 启用“开启异步调用状态持久化”参数,并选择3中自动创建的日志组和日志流。
图2 开启异步调用状态持久化
- 在LTS服务配置日志结构化。
- 登录云日志服务LTS控制台,左侧导航栏选择“日志管理”,在日志组列表模块可查看自动创建的日志组和日志流。
图3 日志组列表
- 单击日志流名称,进入日志流详情页。
- 在日志流详情页,如图4所示单击右上角的日志设置。
- 在设置弹窗中,选择“云端结构化解析”页签,如图5所示配置日志结构化。
- 场景:选择“分隔符”。
- 选择示例日志:填入“x|x|0|0|0|x”。
此处表示占位符,代表前2个字段为string类型,中间3个字段为long类型,最后1个字段为string类型。
- 指定分隔符:“|”。
- 单击步骤3的“智能提取”智能生成字段,并单击
参考表4修改字段名称,修改完成后如图6所示。
- 修改完成后单击“保存”。
- 登录云日志服务LTS控制台,左侧导航栏选择“日志管理”,在日志组列表模块可查看自动创建的日志组和日志流。
相关文档
- 除使用控制台外,函数工作流支持通过API的方式管理函数的异步配置,详情请参见函数异步配置API。
- 若修改异步配置时报“用户权限不足”,请添加“FunctionGraph Administrator”权限,具体操作方法请参见创建用户并授权使用FunctionGraph。