默认

Web端即时通讯实践干货:如何让WebSocket断网重连更快速?

查看数: 106486 | 评论数: 14 | 收藏 6
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-08-03 13:47

正文摘要:

本文由作者网易智慧企业web前端开发工程师马莹莹,发布于公众号“网易智慧企业技术+”,原题“细说websocket快速重连机制”(链接:mp.weixin.qq.com/s/fMXv7hYobUeZzth-ehRNAw)。 为了提升内容质量,即时通讯网收 ...

评论

JackJiang 发表于 3 年前
引用:袁凯明 发表于 2021-01-23 22:56
如何理解以下问题?
1.网络抖动,会导致所有客户端的网络断掉吗?客户端怎么会立即同时向服务端发起连接? ...

1、客户端一般会有断线自动重连机制,客户端在判定到断线时,都在同一时刻启动重连(一般的做法是给客户端一个随机的重启启动时间,这样就不会都在同一时刻启动)。

2、3:客户端在有心跳算法的情况下,是可以自行判定连接不可用的。
袁凯明 发表于 3 年前
如何理解以下问题?
1.网络抖动,会导致所有客户端的网络断掉吗?客户端怎么会立即同时向服务端发起连接?
2.上层应用无法改变只能由服务器发起断开连接这种协议层面的规则,客户端不能直接发起断开连接的请求吗?
3.在上层通过业务逻辑保证旧连接完全失效,模拟连接断开,然后在发起新连接,恢复通讯。上层如何通过业务逻辑保证旧连接完全失效,如何模拟连接断开?
JackJiang 发表于 3 年前
引用:ym_im 发表于 2020-08-28 14:25
那订阅消息或者渠道消息。就是比如某个企业开始直播了。这个企业下面的所有员工都能收到一条企业开播的消 ...

你这个做法,有个专业的叫法:“轮询”,如果你的实时性要求不需要太高的话,轮询是很经济适用的,成本又低,技术又简单。
ym_im 发表于 3 年前
引用:JackJiang 发表于 2020-08-27 15:19
理想测试下是的,但事件通知只是个通知,极端情况下并不能保证你的app一定就能收到,你可以自已写套算法 ...

那订阅消息或者渠道消息。就是比如某个企业开始直播了。这个企业下面的所有员工都能收到一条企业开播的消息。可能这个企业人特别多达到几万人。这个消息虽然实时性要求不高,但是也不能太慢。

--------------------------------------------------------------------------------------------------------------------------------
我目前是在客户端的心跳中包含自己的订阅号。每次心跳到服务器,服务器从cache里面查一下,有没有
新的订阅消息。

这个做法怎么样。还是有新的订阅消息了。直接遍历发送给这个企业的所有人
JackJiang 发表于 3 年前
引用:ym_im 发表于 2020-08-27 14:19
心跳间隔事件短费电,时间长体验不好。

手机wifi切换4g、5g、或者4g、5g切换手机wifi,这些事件,app ...

理想测试下是的,但事件通知只是个通知,极端情况下并不能保证你的app一定就能收到,你可以自已写套算法试试看。心跳是主流做法,你不需要去纠结,因为这是大家都趟过坑后的实践总结。

另外,这一篇文章你可以看看:《为什么说基于TCP的移动端IM仍然需要心跳保活?
ym_im 发表于 3 年前
引用:JackJiang 发表于 2020-08-27 14:15
只有自已做心跳是最靠谱的。默认的tcp协议实现中,客户端到服务端间的路由这么多跳,随便一个环节出故障 ...

心跳间隔事件短费电,时间长体验不好。

手机wifi切换4g、5g、或者4g、5g切换手机wifi,这些事件,app是不是都可以获取到
JackJiang 发表于 3 年前
引用:ym_im 发表于 2020-08-27 13:58
手机客户端使用 epoll 监听 socekt,正常服务器断开客户端可以获取断开事件,但是如果客户端断网等情况, ...

只有自已做心跳是最靠谱的。默认的tcp协议实现中,客户端到服务端间的路由这么多跳,随便一个环节出故障,你的这条tcp连接也是无法感知的(也就是没法知道是否已经断开),只有自已在应用层做心跳是最好的方法。
ym_im 发表于 3 年前
引用:JackJiang 发表于 2020-08-26 22:15
确实没有更好的办法,够用就行了。

手机客户端使用 epoll 监听 socekt,正常服务器断开客户端可以获取断开事件,但是如果客户端断网等情况,客户端没有监听到事件,有什么好办法快速解决获取断开状态吗
JackJiang 发表于 3 年前
引用:ym_im 发表于 2020-08-26 18:21
都是干货啊。我简单写了退避算法。就是起始重连间隔,最大重连时间间隔,每次递增间隔。这三个值都是服务器 ...

确实没有更好的办法,够用就行了。
ym_im 发表于 3 年前
引用:ym_im 发表于 2020-08-26 18:21
都是干货啊。我简单写了退避算法。就是起始重连间隔,最大重连时间间隔,每次递增间隔。这三个值都是服务器 ...

同时让上层在wifi或者流量切换后。直接调用重连接口
ym_im 发表于 3 年前
都是干货啊。我简单写了退避算法。就是起始重连间隔,最大重连时间间隔,每次递增间隔。这三个值都是服务器返回给客户端的。不知道有没有其他更好的方法
JackJiang 发表于 3 年前
引用:Fly463061655 发表于 2020-08-19 13:53
"网络状态由offline变为online"
文中一直提到的这种状态变化事件,是如何得知的

如果是android的话,是有系统网络事件的。但ios或普通的pc端(ios端有个官方的Reachability演示,具体看看这个帖子:https://www.cnblogs.com/sunfuyou/p/6838609.html),基本就是只能自已额外写网络探测逻辑。
Fly463061655 发表于 3 年前
"网络状态由offline变为online"
文中一直提到的这种状态变化事件,是如何得知的
天黑请闭嘴 发表于 3 年前
这篇文章真的不错, 很少见到这种一手干货了,赞群主整理分享

返回顶部