
# 配置函数的流式返回
#### 函数流式返回概述
为满足当前Web应用及AI应用在实时数据传输和大报文传输方面的需求，函数支持配置流式返回开关，将函数的响应报文以HTTP流式传输的方式返回给客户端。
**采用流式返回具有以下优势：**
- 支持更大规模的响应报文（最大可达200M）。
- 由于流式传输无需一次性传输全部报文，可在函数代码中分批处理和传输数据，有效降低内存占用。
- 通过流式传输可实现更快的首字节响应时间。
**适用场景包括：**
- 大文件或大数据集的处理场景（如图片、视频处理等）。
- 实时数据处理场景（例如AI大模型应用需使用Server-Sent Events (SSE) 协议进行数据传输），需要快速返回响应数据，而非一次性返回全部数据。
 
#### 约束与限制
- 流式返回配置当前支持"西南-贵阳一"和"华北-北京四"区域使用。
- **仅容器镜像函数、定制运行时函数和HTTP函数支持配置流式返回。**
- 流式返回最大支持响应报文大小为200MB。
- 流式返回仅支持同步调用，执行超时时间限制最大300s。
 
#### 配置流式返回
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，在左侧的导航栏选择"函数 \> 函数列表"。
2. 单击函数的名称，进入函数详情页。在"设置"页签下选择"高级设置"。
3. 开启"流式返回"，单击"保存"。
   图1开启流式返回   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002369100848.png "点击放大")
   
   
 
#### 编写流式返回函数代码
以下为容器镜像函数、HTTP函数和定制运行时函数的代码示例。
- [容器镜像函数示例代码]
  
  参考[使用容器镜像创建函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1047.html)完成容器镜像函数创建，并开启流式返回。请注意，[函数超时时间配置](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1828.html)需控制在300s以内，否则将导致函数保存失败。
  为了确保函数能够正确返回流式数据，在函数的响应体生成过程中，建议分批次写入流式数据，以避免内存浪费。以下提供一个简单的Java SpringBoot应用返回流式数据的示例：
  ```
  @SpringBootApplication
  @RestController
  public class SpringBootDemoHelloworldApplication {
      private ExecutorService executor = Executors.newCachedThreadPool();
      public static void main(String[] args) {
          SpringApplication.run(SpringBootDemoHelloworldApplication.class, args);
      }
      /**
       * Stream Response
       * @return
       */
      @PostMapping(value = "/invoke")
      public ResponseEntity<ResponseBodyEmitter> invoke(@RequestBody Map<String, Object> body) {
          ResponseBodyEmitter emitter = new ResponseBodyEmitter();
          executor.submit(() -> {
              try {
                  emitter.send("hello \n", MediaType.TEXT_EVENT_STREAM);
                  emitter.send("world \n", MediaType.TEXT_EVENT_STREAM);
                  emitter.complete();
              } catch (Exception ex) {
                  emitter.completeWithError(ex);
              }
          });
          HttpHeaders responseHeaders = new HttpHeaders();
          responseHeaders.setContentType(MediaType.TEXT_EVENT_STREAM);
          return new ResponseEntity(emitter, responseHeaders, HttpStatus.OK);
      }
  }
  ```
- [HTTP函数示例代码]
  参考[创建HTTP函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1442.html)完成HTTP函数创建，并开启流式返回。请注意，[函数超时时间配置](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1828.html)需控制在300s以内，否则将导致函数保存失败。
  HTTP函数的示例代码可参考[容器镜像函数示例代码]。
- [定制运行时函数示例代码]
  定制运行时函数需调用http://$RUNTIME_API_ADDR/v1/runtime/invocation/response/$REQUEST_ID的POST方法返回流式数据。以下为一个简单的Shell类型bootstrap示例：
  ```
  #!/bin/sh
  set -o pipefail
  #Processing requests loop
  while true
  do
    HEADERS="$(mktemp)"
    # Get an event
    EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://$RUNTIME_API_ADDR/v1/runtime/invocation/request")
    # Get request id from response header
    REQUEST_ID=$(grep -Fi x-cff-request-id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
    if [ -z "$REQUEST_ID" ]; then
      continue
    fi 
    # Send streamdata file content back to client
    curl -X POST "http://$RUNTIME_API_ADDR/v1/runtime/invocation/response/$REQUEST_ID" -H "Content-Type:application/octet-stream" --data-binary "@code/streamdata.txt"
  done
  ```
#### 测试流式返回函数
1. 在函数详情页的"代码"页签下，单击"测试"，弹出"配置测试事件"弹窗。
2. 选择"空白模板"，无需修改单击"创建"。
3. 选择[2]创建的测试事件，再次单击"测试"。
4. 函数执行成功后，将自动启动下载，下载文件名为此次请求的ID，文件内容为此次请求的返回值。
   图2文件下载   
   ![](https://support.huaweicloud.com/usermanual-functiongraph/zh-cn_image_0000002369271648.png "点击放大") 
 
