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

部署在Google Cloud Run的Flask应用长请求无响应问题求助

Google Cloud Run部署Flask应用长请求无响应问题排查思路

问题描述

我将Python Flask应用部署为Google Cloud Run服务,监听8080端口处理请求。多数请求能正常返回结果,但当传入特定URL参数导致函数运行时长从5-10分钟延长至20分钟时,应用无法向客户端返回响应。

客户端使用的requests.post()代码如下:

response = requests.post(
    f'{service_url}/run',
    headers={
        'Authorization': f"Bearer {self.bearer_token}", 
        "Content-Type": "application/json",
        'x-environment': 'production'
    }
)
response.raise_for_status()
return response

已确认:

  • 函数本身执行成功,日志中print('Finished!')语句已运行,无错误返回
  • Cloud Run超时设置足够(3600秒/1小时)
  • 本地运行应用无法复现问题,确定故障与Cloud Run环境相关

由于该请求属于大型作业的一部分,存在下游依赖,尽量避免采用异步方式(如后台线程运行时先返回响应)。

Flask核心代码:

@app.route('/run', methods=['POST'])
def run():
    # 此处为单线程长耗时函数

    if is_error:
        status_code = 500
    else:
        status_code = 200
    response = make_response(result, status_code)
    print('Finished!')
    return response

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=8080)

排查思路

  • 检查客户端及链路超时:requests.post()默认无超时限制,但客户端所在环境(如公司内网、代理服务器)可能存在更短的超时设置,导致客户端提前断开连接,即便Cloud Run处理完成也无法返回响应。建议显式设置客户端超时参数timeout=3600,同时查看客户端是否有连接中断类报错。
  • 解决Cloud Run闲置连接超时:Cloud Run默认对HTTP请求设置600秒(10分钟)的闲置超时——若请求过程中超过10分钟无数据传输(长函数仅后台计算无输出),Cloud Run会主动断开与客户端的连接。即便后续函数执行完成,已断开的连接也无法传递响应。
    解决办法是通过流式响应定期发送空字节保持连接活跃,修改Flask代码示例:
    from flask import Response
    import time
    
    @app.route('/run', methods=['POST'])
    def run():
        def generate_response():
            # 将长耗时函数拆分为多个步骤,每步后发送空字节保活
            execute_step_1()
            yield b''  # 发送空字节维持连接
            time.sleep(1)  # 确保字节被传输
            execute_step_2()
            yield b''
            # ... 其他步骤执行
    
            # 最后返回结果
            if is_error:
                yield b'{"error": "执行失败"}'
                current_status = 500
            else:
                yield result
                current_status = 200
            print('Finished!')
        return Response(generate_response(), status=current_status, content_type='application/json')
    
  • 检查Cloud Run实例资源限制:当函数运行20分钟时,可能出现CPU或内存瓶颈。即便日志显示执行完成,实例也可能因资源不足在返回响应阶段卡住。可查看Cloud Run监控指标(CPU使用率、内存使用率),若存在资源耗尽情况,调高实例的CPU和内存配置。
  • 禁用Flask响应缓冲:Flask默认会缓冲整个响应内容,直到生成完成才发送。若返回结果result体积较大,结合长耗时计算,可能导致缓冲超时。可在生成响应后添加response.headers['X-Accel-Buffering'] = 'no'禁用缓冲,或直接采用流式响应避免缓冲问题。
  • 排查网络中间件超时:若使用了Cloud CDN或第三方负载均衡,需确认它们的超时设置是否匹配Cloud Run的3600秒,避免中间件提前断开连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:22:38