部署在GCP Cloud Run的FastAPI未终止超时请求问题排查
连接关闭信号未被Web服务器捕获:Cloud Run触发15秒超时后,会主动断开与客户端的HTTP连接,但这个连接关闭的信号(如TCP FIN/RST包)可能没被FastAPI依赖的Uvicorn等Web服务器及时检测到。Uvicorn默认配置不会主动轮询连接状态,导致处理请求的线程/协程继续执行下游调用,直到流程自然结束。
同步请求的线程池特性:如果你的FastAPI接口用的是同步函数(未使用
async def),请求会在Uvicorn的线程池中处理。Cloud Run断开连接后,Uvicorn不会强制终止线程池中的运行任务——因为强制终止线程可能引发资源泄漏或数据不一致,所以会等待任务自行完成。下游超时配置未正确生效:你给下游API设置的超时可能存在执行漏洞。比如用
requests库时,仅设置timeout参数但未捕获超时异常并终止流程;或是异步调用(如httpx.AsyncClient)时,未正确处理TimeoutException,导致请求仍会继续执行直至下游返回结果。异步任务与主请求生命周期解绑:如果FastAPI接口中使用了
BackgroundTasks或其他异步后台任务,主请求的连接被Cloud Run关闭后,后台任务不会随之终止,仍会在容器内继续执行到完成。进程未响应终止信号:Cloud Run在断开连接后,会向容器发送SIGTERM信号要求进程退出,但如果FastAPI所在的进程没有监听并处理该信号,或是处理逻辑未终止正在进行的请求,那么当前请求会继续执行直至结束。
内容的提问来源于stack exchange,提问作者Paolo Fusari

