websocket的消息丢失处理,以及前端监听心跳处理方案

发布时间 2023-11-09 10:14:39作者: enShine
消息丢失处理方案:
1、后台通过websocket传输给前端消息,并且后台生成校验此消息的定时任务,设置每5秒重发
2、前端接收到消息后将消息通过websocket传输给后台
3、后台如接收到前端的消息则删除对应的发送消息定时任务,如未收到消息则继续发送,设置最多发送5次(超过5次默认认为此条消息记录有误)
4、建议:建议websocket发送消息单独为一个模块,防止定时任务过多抢占服务内存情况发生。

前端监听心跳处理方案:

websocket连接上
1、申请一个变量heartbeatStatus,记录当前心跳检测状态,有三个状态:等待中,已收到应答、超时。
2、监听WS实例的message事件,监听到就将heartbeatStatus改为:已收到应答。
3、监听WS实例的open事件,打开后启动心跳检测。

一般需要在计时器中监听,定时发送心跳检测信息,服务器端接收到心跳包信息,通过websocket发送信息给客户端,客户端修改心跳状态;如果两个以上的心跳包都没有得到反馈,则表示掉线,需要重新连接websocket。

// 发送消息,用来发送心跳包
WS.send('hello'); 
// 关闭连接,当发送心跳包不响应,需要重连时,最好先关闭
WS.close();

注意:
心跳检测异常,但close事件没有触发,大概率是双方之间的网络线路不佳,如果立马进行重连,会挤兑更多的网络资源,重连的失败概率更大,也可能阻塞用户的其它操作。

但也不排除确实是连接的问题,如服务器宕机、意外重启,同时没有告知浏览器需要把旧连接关闭。

所以一发生心跳不应答,个人推荐的做法是,发生延迟后,提醒用户网络异常正在修复中,让用户有个心理准备。然后多发一两个心跳包,连续不应答再提示用户掉线了,是否重连。如果中途正常了,就不需要重连,用户体验更好,对服务器的压力也更小。