AWS ECS启用Service Connect后SSE流式传输失效,结果被缓冲返回
解决ECS Fargate Service Connect下SSE流式传输缓冲问题
问题背景
后端服务作为LLM流式代理,前端通过SSE动态接收结果,本地及未启用Service Connect的ECS Fargate环境运行正常,但启用Service Connect后,流式响应被缓冲,仅一次性返回完整结果。服务代码无自定义缓冲逻辑:
@PostMapping(value = "/completions", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> complete(@Valid @RequestBody CompletionRequest request) { return goApiWebClient.post() .uri("/v1/chat/completions") .bodyValue(completionRequest) .retrieve() .bodyToFlux(String.class) .takeWhile(response -> !response.equals("[DONE]")) .onErrorResume(e -> Flux.just("Error while calling ChatGPT API: " + e.getMessage())); }
问题根源
ECS Service Connect基于Envoy代理实现服务间通信,Envoy默认会缓冲HTTP响应以优化性能,但这会破坏SSE这类流式传输的实时性。
解决方案
无需手动修改Envoy配置文件,可通过以下两种方式在Fargate环境中禁用目标路由的缓冲:
方式1:通过ECS Service Connect路由配置禁用缓冲
- 登录AWS控制台,进入ECS服务详情页
- 编辑服务的Service Connect配置
- 在对应的路由条目(指向你的后端服务的路由)中,添加自定义属性:
- 键:
envoy.route.disable_buffering - 值:
true
- 键:
- 保存配置并重新部署服务
方式2:通过任务定义环境变量配置
在后端服务的任务定义中,为容器添加以下环境变量之一:
- 全局禁用所有路由缓冲:
ENVOY_ROUTE_CONFIG_DISABLE_BUFFERING=true - 仅针对
/completions接口禁用缓冲(更精细控制):ENVOY_ROUTE_CONFIG_/completions_DISABLE_BUFFERING=true
添加后重新部署任务即可生效。
验证步骤
- 重新部署服务后,发起SSE请求测试
/completions接口,确认响应是否按流式返回 - 若启用了Envoy访问日志,可检查日志中是否包含
disable_buffering: true的配置标识
额外注意事项
- 确保服务返回的响应头包含
Cache-Control: no-cache和Connection: keep-alive,避免任何中间层缓存响应 - 确认Service Connect的路由规则正确匹配
/completions接口路径
内容的提问来源于stack exchange,提问作者Sarkhad
相关产品推荐
相关产品推荐

