更新时间:2025-08-18 GMT+08:00

配置函数的流式返回

函数流式返回概述

为满足当前Web应用及AI应用在实时数据传输和大报文传输方面的需求,函数支持配置流式返回开关,将函数的响应报文以HTTP流式传输的方式返回给客户端。

采用流式返回具有以下优势:

  • 支持更大规模的响应报文(最大可达200M)。
  • 由于流式传输无需一次性传输全部报文,可在函数代码中分批处理和传输数据,有效降低内存占用。
  • 通过流式传输可实现更快的首字节响应时间。

适用场景包括:

  • 大文件或大数据集的处理场景(如图片、视频处理等)。
  • 实时数据处理场景(例如AI大模型应用需使用Server-Sent Events (SSE) 协议进行数据传输),需要快速返回响应数据,而非一次性返回全部数据。

约束与限制

  • 流式返回配置当前支持“西南-贵阳一”“华北-北京四”区域使用。
  • 仅容器镜像函数、定制运行时函数和HTTP函数支持配置流式返回。
  • 流式返回最大支持响应报文大小为200MB。
  • 流式返回仅支持同步调用,执行超时时间限制最大300s。

配置流式返回

  1. 登录函数工作流控制台,在左侧的导航栏选择“函数 > 函数列表”。
  2. 单击函数的名称,进入函数详情页。在“设置”页签下选择“高级设置”。
  3. 开启“流式返回”,单击“保存”
    图1 开启流式返回

编写流式返回函数代码

以下为容器镜像函数、HTTP函数和定制运行时函数的代码示例。

参考使用容器镜像创建函数完成容器镜像函数创建,并开启流式返回。请注意,函数超时时间配置需控制在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函数创建,并开启流式返回。请注意,函数超时时间配置需控制在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 文件下载