6月1日 09:11

WebSocket 常见问题怎么排查?连接失败/消息丢失/频繁断开

WebSocket连接问题主要集中在四个环节:建立、握手、传输、稳定性。连接无法建立时,先确认服务器是否启动、端口是否正确、防火墙是否放行,再检查协议——本地开发用ws,生产环境必须wss,部分反向代理默认不转发WebSocket升级请求,需显式配置。握手失败通常是服务端校验不通过:Origin白名单未放行、子协议不匹配、认证信息缺失。消息丢失多因连接已断开但客户端未感知,或发送队列溢出被丢弃。连接频繁断开要排查心跳是否缺失、Nginx代理超时配置、网络中间件是否主动杀长连接。调试时重点监听onerror和onclose事件,通过close code定位原因(1006异常关闭、1008策略违规等),浏览器DevTools的Network面板可查看完整帧数据。

追问

ws和wss混用会导致什么问题?

浏览器强制HTTPS页面只能发起wss连接,ws会被直接拦截。即使服务端支持ws,混用也会触发安全策略报错。开发环境可用ws,上线必须切wss并配置SSL证书。

Nginx反向代理WebSocket需要什么额外配置?

必须加UpgradeConnection头:

nginx
location /ws { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 3600s; }

proxy_read_timeout默认60秒,超过不活动就断开,需按业务调大。

如何检测连接是否还活着?

实现心跳机制:客户端定时发ping帧,服务端回pong。若连续N次未收到响应则判定断连,主动重连。不要依赖TCP的keepalive,那个超时太长(默认2小时),不实用。

close code各代表什么?

1000正常关闭,1001端点离开,1006异常关闭(未收到关闭帧,通常是网络断开),1008策略违规,1011服务端异常。1006最常见,说明连接不是正常关闭的,要排查网络和中间件。

消息发送队列溢出怎么处理?

发送前判断readyState是否为OPEN,非OPEN状态入队缓存,连接恢复后补发。设队列上限,超出则丢弃旧消息或拒绝新消息,避免内存撑爆。关键业务消息要做服务端ACK确认,不能发完就当成功。

标签:WebSocket