部署在Google Cloud的socket.io服务端无法与客户端维持持久连接问题
问题排查与解决方案
1 端口监听配置修正
你当前硬编码监听8080端口不符合App Engine运行规范,平台会动态分配服务端口,必须优先读取环境变量PORT的值,修改监听代码如下:
const PORT = process.env.PORT || 8080; server.listen(PORT, () => { console.log(`Server is listening on port ${PORT}`); });
该修改可解决日志中抛出的端口配置告警。
2 Socket.IO 传输协议适配
App Engine标准环境的NGINX代理层默认对HTTP长轮询的超时限制为10秒,刚好对应你遇到的10秒断开重连现象。Socket.IO默认优先走HTTP长轮询再尝试升级WebSocket,会被代理层的超时规则强制断开,需修改服务端Socket.IO初始化配置,强制使用WebSocket传输、调大心跳阈值:
const io = new Server(server, { transports: ['websocket'], pingTimeout: 60000, pingInterval: 25000 });
需同步修改Android客户端的Socket.IO连接配置,同样指定传输方式为websocket,保持两端配置一致。
3 App Engine 扩缩容配置调整
你当前使用的F1实例默认自动扩缩容,闲置实例会被平台主动回收导致连接断开,若服务访问量较低,可调整app.yaml的扩缩容规则降低实例回收概率:
automatic_scaling: min_idle_instances: 1 max_idle_instances: 1 min_pending_latency: 3000ms max_pending_latency: automatic
如果调整后仍频繁出现断开问题,可切换到App Engine灵活环境,该环境对WebSocket长连接的支持更稳定,无标准环境的传输层约束。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

