更新时间: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 文件下载