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

Google Cloud Run中客户端断开连接事件触发异常排查

问题:Google Cloud Run中无法即时检测SSE客户端断开连接

我在前端fetch中使用了AbortController的signal,后端Node.js通过以下代码监听客户端断开连接:

req.connection.on("close", () => {
    logger.info("Client disconnected")
    abortController.abort()
})

这个逻辑在本地环境正常工作,但部署到Google Cloud Run(GCR)后,客户端断开连接事件仅在API执行完成后才会触发。我的API是基于SSE构建的,即时检测断开并触发abort对我来说至关重要。后端设置的响应头如下:

res.setHeader("Content-Type", "text/event-stream")
res.setHeader("Cache-Control", "no-cache")
res.setHeader("Connection", "keep-alive")

请问我哪里操作有误,或是遗漏了什么配置?我需要在客户端断开时立即触发后端的abort操作。


可能的原因及解决方案

  • 禁用Cloud Run响应缓冲:Cloud Run默认会缓冲响应内容,直到响应完成才推送给客户端,这会导致TCP断开信号无法即时传递到你的Node.js服务。添加X-Accel-Buffering: no响应头,强制Cloud Run流式传输SSE内容:
    res.setHeader("X-Accel-Buffering", "no")
    
  • 定期发送SSE心跳包:如果SSE连接长时间无数据传输,Cloud Run的负载均衡可能无法及时感知客户端断开。每隔15-30秒发送一个心跳包(比如event: ping\n\n),既能维持连接活性,也能在客户端断开时快速触发close事件。
  • 改用请求级别的close事件监听:直接监听req对象的close事件比监听底层req.connection更可靠,因为connection可能被多个请求复用,而req的close事件绑定到当前请求周期:
    req.on("close", () => {
        logger.info("Client disconnected")
        abortController.abort()
    })
    
  • 检查Cloud Run请求超时配置:Cloud Run默认请求超时为900秒(15分钟),如果你的SSE连接需要更长周期,需在部署时调整超时参数,但心跳包仍是维持连接、检测断开的核心手段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:42:03