更新时间:2025-08-18 GMT+08:00
配置函数的流式返回
函数流式返回概述
为满足当前Web应用及AI应用在实时数据传输和大报文传输方面的需求,函数支持配置流式返回开关,将函数的响应报文以HTTP流式传输的方式返回给客户端。
采用流式返回具有以下优势:
- 支持更大规模的响应报文(最大可达200M)。
- 由于流式传输无需一次性传输全部报文,可在函数代码中分批处理和传输数据,有效降低内存占用。
- 通过流式传输可实现更快的首字节响应时间。
适用场景包括:
- 大文件或大数据集的处理场景(如图片、视频处理等)。
- 实时数据处理场景(例如AI大模型应用需使用Server-Sent Events (SSE) 协议进行数据传输),需要快速返回响应数据,而非一次性返回全部数据。
约束与限制
- 流式返回配置当前支持“西南-贵阳一”和“华北-北京四”区域使用。
- 仅容器镜像函数、定制运行时函数和HTTP函数支持配置流式返回。
- 流式返回最大支持响应报文大小为200MB。
- 流式返回仅支持同步调用,执行超时时间限制最大300s。
配置流式返回
- 登录函数工作流控制台,在左侧的导航栏选择“函数 > 函数列表”。
- 单击函数的名称,进入函数详情页。在“设置”页签下选择“高级设置”。
- 开启“流式返回”,单击“保存”。
图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
测试流式返回函数
- 在函数详情页的“代码”页签下,单击“测试”,弹出“配置测试事件”弹窗。
- 选择“空白模板”,无需修改单击“创建”。
- 选择2创建的测试事件,再次单击“测试”。
- 函数执行成功后,将自动启动下载,下载文件名为此次请求的ID,文件内容为此次请求的返回值。
图2 文件下载