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

部署到Google Cloud Run的Node.js MQTT WebSocket服务客户端周期性断开

问题根源

该问题是Google Cloud Run的平台特性导致的,和你的MQTT服务代码无关:
Cloud Run前置的Google前端网关默认对所有HTTP/HTTPS连接设置了300秒(5分钟)的闲置超时规则,只要连接连续5分钟没有被网关识别为活跃的流量传输,就会被主动切断。你部署在物理机、普通Cloud VM时没有这层网关的超时限制,所以不会出现周期性断开的情况。
你当前每15秒发送的MQTT业务报文封装在WebSocket二进制帧中,未被网关判定为可重置超时的有效活跃流量,因此还是会触发5分钟切断规则。

规避方案

  • 调整MQTT心跳参数(优先使用)
    在客户端初始化连接的配置中,显式添加小于300秒的keepalive参数(单位为秒,建议设为120即2分钟),强制客户端定期发送心跳包保持连接活跃:

    let client = mqtt.connect(host, {    
        clientId: clientId,
        keepalive: 120
    });
    

    配置生效后客户端会每2分钟向服务端发送PINGREQ心跳帧,服务端自动返回PINGRESP响应,即可重置网关的超时计时器,避免连接被切断。

  • 延长Cloud Run服务超时阈值
    如果你需要更长的无活动连接保持时间,可以调整Cloud Run的请求超时上限,目前平台支持最长设置为3600秒(1小时),在部署命令中添加--timeout参数即可生效:

    gcloud run services update 你的服务名称 --timeout=3600 --region=你的部署区域
    

    该方案仅能延长超时时间到1小时,超过1小时的连接依然会被强制切断,建议和心跳参数配置配合使用。

  • 更换适配长连接的部署平台
    如果业务需要大量长期保持的MQTT长连接,更建议将服务部署到Google Cloud Compute Engine、GKE等无强制长连接超时限制的服务上,从底层规避网关超时问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:42:02