
# 调用函数
函数创建和配置完成后，可通过RESTful API或者云服务事件源触发函数执行。
- RESTful API：通过调用API直接触发函数。
- 云服务事件源：由云服务触发函数，即使用函数触发器。
根据客户端是否需要等待函数的处理结果，函数的调用可分为同步调用和异步调用两种方式。
- [同步调用]
  同步调用是指客户端调用函数后，FunctionGraph会立即执行函数，等函数执行完成后再向客户端返回响应和执行结果。
  **同步调用应用场景：**
  同步调用的响应时间较短，适用于需要实时响应的业务场景。
  **应用场景示例一：** **实时数据处理与查询**
  需要快速获取实时数据（如订单状态、支付结果）。同步调用能够立即处理请求并返回结果，满足实时性需求。
  **应用场景示例二：** **即时交互与控制**
  需要即时看到操作结果（如消息发送成功）。同步调用能够确保操作的实时性和反馈的即时性。
- [异步调用]
  异步调用是指客户端调用函数后，FunctionGraph会将请求排队，不等待函数的执行结果，直接向客户端返回响应，FunctionGraph会在系统空闲的情况下逐个处理排队的请求。
  异步调用场景下客户端无法实时感知函数的执行结果，如需获取异步请求的结果通知或者设置异步请求失败重试，请参见[配置函数的异步调用策略](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0390_03.html)。也可以使用[异步执行函数](https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0126.html)接口异步触发函数。
  **异步调用应用场景：**
  异步调用适用于可以延迟处理，不需要实时响应，且可能需要较长时间或大量资源的任务。异步调用能够提升系统的响应速度和吞吐量，同时确保任务的可靠执行。
  **应用场景示例一：媒体处理与转换**
  - 图片压缩与格式转换：上传图片后，系统在后台异步处理图片，执行压缩、裁剪或格式转换，完成后将处理的图片存储于指定位置。图片处理需要一定时间，异步调用可避免等待。
  
  - 视频转码与剪辑：上传视频后，系统在后台异步完成视频的转码、剪辑或添加水印。视频处理耗时较长，异步调用可以释放系统资源，保障其他任务正常运行。
  
  
  **应用场景示例二：数据处理与集成**
  - ETL任务（数据清洗与转换）：定期从数据库中提取数据，进行清洗、转换和加载到目标存储或分析平台，完成后生成报告并通知相关人员。ETL任务涉及大量数据和复杂计算，异步调用可避免系统阻塞，提高处理效率。
  
  - 日志分析与统计：收集系统日志后，在后台异步进行日志分析、异常检测及统计，完成后将结果存储或发送至监控系统。日志分析需要较长时间，异步调用确保系统在高峰期间仍能正常运行。
   
#### 约束与限制
- 同步调用场景下，函数最大运行时长限制为15分钟（900秒）。
- 异步调用场景下，函数最大运行时长限制为259200秒（3天）。如果业务有更大的最大执行时长需求，请[提交工单](https://console.huaweicloud.com/ticket/?agencyId=e4ebeeb18baa4ae58946b5342fa6159d#/ticketindex/createIndex)申请。
  在函数详情页中支持自定义配置函数执行超时时长，具体请参见[配置函数的常规信息](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1828.html)，配置的函数执行超时时长需小于函数最大运行时长限制。
  
- 如果函数执行端到端时延超过90s，建议使用异步调用。如果使用同步调用，会因为网关限制，时延超过90s后无法收到同步响应。
 
#### 函数触发器的调用方式
根据函数调用方式，函数的触发器可分为同步调用和异步调用。关于函数调用的更多说明请参见[调用函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0160.html)。
- 同步调用：客户端调用函数后，FunctionGraph会立即执行函数，等函数执行完成后再向客户端返回响应和执行结果。
- 异步调用：客户端调用函数后，FunctionGraph会将请求排队，不等待函数的执行结果，直接向客户端返回响应，FunctionGraph会在系统空闲的情况下逐个处理排队的请求。
表1函数触发器的调用机制 
| 触发器                            | 调用方式                                                                                                                                                                  |
|:---|:---|
| API网关服务（APIG专享版）触发器            | 默认为同步调用，但可以修改为异步调用，具体配置方式请参考[配置异步调用](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0160.html#functiongraph_01_0160__section624482414561)。 |
| API Connect（APIC）触发器           | 默认为同步调用，但可以修改为异步调用，具体配置方式请参考[配置异步调用](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0160.html#functiongraph_01_0160__section624482414561)。 |
| 定时触发器（TIMER）触发器                | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 云数据库 GeminiDB DynamoDB触发器      | 默认为同步调用，且不可修改。                                                                                                                                                        |
| 云审计服务（CTS）触发器                  | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 文档数据库服务（DDS）触发器                | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 数据接入服务（DIS）触发器                 | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 分布式消息服务 Kafka版（KAFKA）触发器       | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 开源Kafka（OPENSOURCEKAFKA）触发器    | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 分布式消息服务 RabbitMQ版（RABBITMQ）触发器 | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 云数据库 GeminiDB Mongo触发器         | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 设备接入（IoTDA）触发器                 | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 云日志服务（LTS）触发器                  | 默认为异步调用，且不可修改。                                                                                                                                                        |
| 消息通知服务（SMN）触发器                 | 默认为异步调用，且不可修改。                                                                                                                                                        |
| EventGrid触发器                   | 默认为异步调用，且不可修改。                                                                                                                                                        |
   
 #### 配置函数的异步调用
以APIG触发器为例，在已创建函数并[配置APIG触发器](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0204.html)的情况下，配置异步调用。
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧导航栏选择"函数 \> 函数列表"，单击函数名称进入函数详情页，选择"设置 \> 触发器"。
2. 单击已配置的APIG触发器名称，跳转至APIG服务页面。
   图1单击触发器名称   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002270258906.png "点击放大") 
3. 单击右上角的"编辑"。
   图2单击"编辑"   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002304858773.png "点击放大")
   
   
4. 单击"下一步"到"后端基础定义"界面，修改调用类型为"Asynchronous"。
   图3修改调用类型   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002304931857.png "点击放大")
   
   
5. 单击"立即完成"，进行保存。
 
#### 函数调用的重试机制
函数在同步调用或异步调用执行失败时，可以通过以下重试机制进行操作。
- 同步调用 同步调用执行失败，需要自行重试。
  
- 异步调用 异步调用可配置最大重试次数和消息最大有限期，具体配置方法请参见[配置函数的异步调用策略](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0390_03.html)。
  FunctionGraph会根据配置的最大重试次数和消息最大有限期（最大有限期为24小时）进行重试。重试次数和配置的最大重试次数一致，重试有效期和配置的消息最大有效期一致。
  
**幂等性**
在编程中，幂等性指应用程序或组件具备识别重复事件和防止重复、不一致或数据丢失的能力。若需要函数保持幂等性，可以通过函数逻辑设计来正确处理重复的事件。
幂等函数逻辑有助于减少以下问题：
- 不必要的API调用
- 代码处理时间
- 数据不一致
- 限制
- 延迟
请确保函数代码可以多次处理相同的事件，而不会导致重复的事务或其他不必要的副作用。如果函数不满足幂等性要求，则当函数调用异常、客户端重试或依赖函数内部重试时，可能会导致重复的事务或其他不必要的副作用。
#### 相关文档
- 除使用控制台外，函数工作流支持通过API的方式调用函数，详情请参见[同步执行函数](https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0125.html)和[异步执行函数](https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0126.html)。
- 调用函数的常见问题排查方法，请参见[调用函数常见问题](https://support.huaweicloud.com/functiongraph_faq/functiongraph_03_0346.html)。
 
