
# 配置函数的异步调用策略
在异步调用函数的场景下，FunctionGraph会将请求排队，不等待函数的执行结果，直接向客户端返回响应，这种情况下客户端无法实时感知函数的执行结果。如果需要设置异步请求失败重试或者获取异步请求的结果通知，可以通过设置异步配置实现。
- 失败重试：用户代码异常造成的失败，FunctionGraph默认不重试。如果函数中有需要重试的场景，例如调用三方服务经常失败，可配置重试提升成功率。
- 结果通知：FunctionGraph可以将异步函数的执行结果传递给下游服务做进一步处理。例如把执行失败信息保存到OBS，用于后续分析失败原因，或者把执行成功信息推送到DIS或再次触发函数做处理等。
#### 约束与限制
表1函数异步配置约束限制 
| 限制场景                         | 具体限制                                                                                                                                                   |
|:---|:---|
| 使用异步调用的函数                    | 使用异步调用的函数，返回值的大小不能超过256KB，否则会返回空值。                                                                                                                     |
| 使用异步配置通知目标服务                 | 请务必保证不要出现循环调用的情况。 例如：函数A配置了成功调用时的异步通知目标为函数B，函数B配置了成功调用时的异步通知目标为函数A，当异步触发函数A并且执行成功后，则可能出现A\>B\>A......循环调用的情况。 |
| 使用异步配置失败时通知分布式消息服务（RocketMQ） | 仅支持"华东-上海一"、"西南-贵阳一"区域配置。                                                                                                                              |
   
#### 前提条件
- 使用异步配置通知目标服务，需配置具有目标服务操作权限的函数委托，配置函数委托详情请参考[配置函数的委托权限](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0920.html)。
- 使用异步配置失败时通知分布式消息服务（RocketMQ），需要[配置函数访问VPC](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0222.html#functiongraph_01_0222__section923421213196)且与通知的RocketMQ实例在同一个VPC中。
  同时，需要确保RocketMQ实例所在的安全组入方向规则已放通实例的连接端口，否则无法通知消息，可参考[连接RocketMQ网络要求](https://support.huaweicloud.com/usermanual-hrm/hrm-ug-075.html)。（当前处于公测阶段，仅支持华东-上海一、西南-贵阳一。）
  
 
#### 配置异步调用策略
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧的导航栏选择"函数 \> 函数列表"。
2. 单击函数的名称，进入函数详情页。
3. 在"设置"页签下选择"异步配置"。
4. 在异步配置页面，单击"配置异步调用"，编辑异步配置信息。
   图1填写配置参数   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002082099498.png "点击放大")
   表2异步配置参数说明 
   | 参数     | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|
   | 异步策略配置 | - 最大重试次数：异步调用失败后最大重试次数，默认为3次，取值范围：0-3。  - 消息最大有效期(s)：消息最大存活时长，取值范围：1-86400秒。  - 开启异步调用状态持久化：开通云日志服务（LTS）后显示该配置开关，具体配置方式请参考[配置异步调用状态持久化]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | 成功时通知  | 目标服务：函数执行成功时发送通知到以下目标服务。 - 函数工作流（FunctionGraph） - 函数名称：选择接收通知消息的函数名称。  - 版本/别名：选择函数对应的版本或别名。    - 对象存储服务（OBS） - 目标桶目录：选择存放通知消息的OBS桶路径。  - 对象前缀目录：输入对象前缀目录，以筛选通知消息要存放的对象文件。  - 对象过期时间(天)：过期后的对象会被OBS服务端自动清理。单位：天，取值范围：0-365，0表示不过期。    - 数据接入服务（DIS） 目标通道：选择接收通知消息的目标通道。   - 消息通知服务（SMN） 主题名称：选择接收通知消息的主题。                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | 失败时通知  | 目标服务：函数执行失败时发送通知到以下目标服务。 - 函数工作流（FunctionGraph） - 函数名称：选择接收通知消息的函数名称。  - 版本/别名：选择函数对应的版本或别名。    - 对象存储服务（OBS） - 目标桶目录：选择存放通知消息的OBS桶路径。  - 对象前缀目录：输入对象前缀目录，以筛选通知消息要存放的对象文件。  - 对象过期时间(天)：过期后的对象会被OBS服务端自动清理。单位：天，取值范围：0-365，0表示不过期。    - 数据接入服务（DIS） 目标通道：选择接收通知消息的目标通道。   - 消息通知服务（SMN） 主题名称：选择接收通知消息的主题。   - 分布式消息服务 RocketMQ版（RocketMQ）（仅支持华东-上海一、西南-贵阳一区域配置。） - 实例：选择接收通知消息的RocketMQ实例。  - Topic：选择接收通知消息的Topic。     |
      
   
5. 单击"确定"保存异步配置。
 
#### 通知消息结构说明
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!"
}
```
表3消息参数说明 
| **参数**                                    | **说明**                            |
|:---|:---|
| 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，通过日志可以查询每次异步调用的执行状态。
![](https://support.huaweicloud.com/usermanual-functiongraph/public_sys-resources/note_3.0-zh-cn.png)
用户默认没有权限开启异步调用状态持久化，如果需要开启异步调用状态持久化，查看调用记录，请在[工单系统](https://console.huaweicloud.com/ticket/?agencyId=e4ebeeb18baa4ae58946b5342fa6159d#/ticketindex/createIndex)提交工单添加白名单。
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧的导航栏选择"函数 \> 函数列表"。
2. 单击函数的名称，进入函数详情页，在"设置"页签下选择"异步配置"。
3. （如已开通云日志服务，可跳过该步骤）在异步配置页面，单击页面上方说明信息中的"点击开通"，开通云日志服务（LTS）。
   此过程中系统会自动调用LTS接口，在LTS控制台创建日志组（名称为function-async-log-group开头的日志组）和日志流（名称为function-async-log-stream开头的日志流），用户无需手动创建日志组和日志流。
   
4. 开通完成后，在页面上单击"配置异步调用"，页面上新增参数"开启异步调用状态持久化"。
5. 启用"开启异步调用状态持久化"参数，并选择[3]中自动创建的日志组和日志流。
   图2开启异步调用状态持久化   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002395349417.png "点击放大")
   
   

6. 在LTS服务配置日志结构化。
   1. 登录云日志服务LTS控制台，左侧导航栏选择"日志管理"，在日志组列表模块可查看自动创建的日志组和日志流。
      图3日志组列表   
      ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002361517388.png "点击放大")
      
      
   
   2. 单击日志流名称，进入日志流详情页。
   
   3. 在日志流详情页，如[图4]所示单击右上角的日志设置。
      图4日志设置   
      ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002395200301.png "点击放大")
      
      
   
   4. 在设置弹窗中，选择"云端结构化解析"页签，如[图5]所示配置日志结构化。
      - 场景：选择"分隔符"。
      
      - 选择示例日志：填入"x\|x\|0\|0\|0\|x"。 此处表示占位符，代表前2个字段为string类型，中间3个字段为long类型，最后1个字段为string类型。
        
      
      - 指定分隔符："\|"。
        图5云端结构化解析   
        ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002395209101.png "点击放大")
        
        
       
   
   5. 单击步骤3的"智能提取"智能生成字段，并单击![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002361705906.png)参考[表4]修改字段名称，修改完成后如[图6]所示。
       表4修改字段 
      | 字段名称   | 修改后字段               |
      |:---|:---|
      | field1 | function_urn        |
      | field2 | request_id          |
      | field3 | seq_status          |
      | field4 | operation_timestamp |
      | field5 | error_code          |
      | field6 | error_message       |
         
      图6修改提取字段   
      ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002395218889.png "点击放大")
      
      
   
   6. 修改完成后单击"保存"。
    
 
#### 相关文档
- 除使用控制台外，函数工作流支持通过API的方式管理函数的异步配置，详情请参见[函数异步配置API](https://support.huaweicloud.com/api-functiongraph/AsynchronousExecutionNotification.html)。
- 若修改异步配置时报"用户权限不足"，请添加"FunctionGraph Administrator"权限，具体操作方法请参见[创建用户并授权使用FunctionGraph](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0215.html)。
 
