You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过AWS ALB/NLB实现响应流?Flask流响应在ALB下失效求助

AWS ALB下Flask流式响应失效的原因与解决方案

问题根源:ALB的默认响应缓冲机制

AWS ALB(应用负载均衡器)默认会缓冲后端服务器的响应数据,直到满足以下条件之一才会把数据发送给客户端:

  • 响应数据达到16KB的缓冲阈值
  • 后端服务器关闭连接

你的Flask流式响应是每秒返回一小段HTML,远达不到16KB的阈值,且连接会持续保持(while True),因此ALB会一直缓冲数据,客户端无法收到任何内容——这确实是ALB的默认行为限制,而非功能Bug。

无需更换NLB的解决方案

优先尝试调整ALB或Flask配置,无需直接切换到NLB:

  1. 关闭ALB目标组的响应缓冲
    进入AWS控制台的目标组配置,找到「属性」标签,开启「禁用响应缓冲」选项。该设置会让ALB立即把后端的响应片段转发给客户端,适配流式场景。
  2. 在Flask响应中添加强制不缓冲的HTTP头
    修改Flask代码,给Response对象添加X-Accel-Buffering: no和Transfer-Encoding: chunked头,明确告知ALB不要缓冲数据:
    from flask import Flask, Response
    from datetime import datetime
    from time import sleep
    
    app = Flask(__name__)
    
    @app.route("/time/")
    def time():
        def streamer():
            while True:
                yield f"<p>{datetime.now()}</p>"
                sleep(1)
        # 添加关键HTTP头
        return Response(streamer(), headers={
            "X-Accel-Buffering": "no",
            "Transfer-Encoding": "chunked"
        })
    

是否需要改用NLB?

NLB(网络负载均衡器)是四层(TCP/UDP)负载均衡器,不会对应用层的响应做任何缓冲处理,流式响应可以直接通过NLB转发给客户端。但切换前需考虑:

  • NLB不支持路径路由、主机头路由等ALB特有的七层功能
  • NLB的HTTPS终止配置复杂度高于ALB
  • 如果业务仅需简单TCP转发,不需要七层路由能力,NLB是可行方案,但优先推荐先通过调整ALB配置解决问题。

内容的提问来源于stack exchange,提问作者Raam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:05:23