正确理解IM长连接的心跳及重连机制,并动手实现(有完整IM源码)即时通讯开发

什么场景下需要心跳呢?目前我们接触到的大多是一些基于长连接的应用需要心跳来“保活”。

由于在长连接的场景下,客户端和服务端并不是一直处于通信状态,如果双方长期没有沟通则双方都不清楚对方目前的状态,所以需要发送一段很小的报文告诉对方“我还活着”。

同时还有另外几个目的:

本文配套的CIM源码地址:

阅读本文需要一定的网络编程以及Netty方面的知识。

有关网络编程基础知识,请阅读以下资料:

有关Netty框架方面的知识,请阅读以下资料:

学习交流:

心跳其实有两种实现方式:

2)应用层自己实现。

所以我们这里所讨论的都是应用层的实现:

常规的实现应当是:

1)开启一个定时任务,定期发送心跳包;

4)超过后则认为服务端出现故障,需要重连。

这样确实也能实现心跳,但并不友好。

在正常的客户端和服务端通信的情况下,定时任务依然会发送心跳包;这样就显得没有意义,有些多余。所以理想的情况应当是客户端收到的写消息空闲时才发送这个心跳包去确认服务端是否健在。

来看看cim中的实现:

在pipeline中加入了一个10秒没有收到写消息的IdleStateHandler,到时他会回调ChannelInboundHandler中的userEventTriggered方法。

所以一旦写超时就立马向服务端发送一个心跳(做的更完善应当在心跳发送失败后有一定的重试次数)。

这样也就只有在空闲时候才会发送心跳包。但一旦间隔许久没有收到服务端响应进行重连的逻辑应当写在哪里呢?

先来看这个示例:

超过则重连。

也就是heartBeatHandler.process(ctx);的执行逻辑。

伪代码如下:

longheartBeatTime=appConfiguration.getHeartBeatTime()*1000;

LonglastReadTime=NettyAttrUtil.getReaderTime(ctx.channel());longnow=System.currentTimeMillis();if(lastReadTime!=null&&now-lastReadTime>heartBeatTime){reconnect();}}

我们假设下面的场景:

2)这时服务端突入出现down机,那么理想情况下应当是客户端迟迟没有收到服务端的响应从而userEventTriggered执行定时任务;

但却事与愿违,并不会执行2、3两步。

因为一旦服务端down机、或者是与客户端的网络断开则会回调客户端的channelInactive事件。

\

这里的destroy()方法会把之前开启的定时任务都给取消掉。所以就不会再有任何的定时任务执行了,也就不会有机会执行这个重连业务。

因此我们得有一个单独的线程来判断是否需要重连,不依赖于IdleStateHandler。

于是cim在客户端感知到网络断开时就会开启一个定时任务:

之所以不在客户端启动就开启,是为了节省一点线程消耗。网络问题虽然不可避免,但在需要的时候开启更能节省资源。

在这个任务重其实就是执行了重连,限于篇幅具体代码就不贴了,感兴趣的可以自行查阅。

同时来验证一下效果:

启动两个服务端,再启动客户端连接上一台并保持长连接。这时突然手动关闭一台服务,客户端可以自动重连到可用的那台服务节点。

启动客户端后服务端也能收到正常的ping消息:

利用:info命令查看当前客户端的链接状态发现连的是9000端口。

:info是一个新增命令,可以查看一些客户端信息。

这时我关掉连接上的这台节点:

这时客户端会自动重连到可用的那台节点。这个节点也收到了上线日志以及心跳包。

现在来看看服务端,它要实现的效果就是延迟N秒没有收到客户端的ping包则认为客户端下线了,在cim的场景下就需要把他踢掉置于离线状态。

有关消息发送误区:

这里依然有一个误区,在调用ctx.writeAndFlush()发送消息获取回调时。

其中是isSuccess并不能作为消息发送成功与否的标准:

也就是说即便是客户端直接断网,服务端这里发送消息后拿到的success依旧是true。这是因为这里的success只是告知我们消息写入了TCP缓冲区成功了而已。

和我之前有着一样错误理解的不在少数,这是Netty官方给的回复:

于是来做个试验:正常通信的客户端和服务端,当我把客户端直接断网时,服务端会自动剔除客户端。

这样就实现了文初的两个要求:

1)服务端检测到某个客户端迟迟没有心跳过来可以主动关闭通道,让它下线;

2)客户端检测到某个服务端迟迟没有响应心跳也能重连获取一个新的连接。

同时也踩了两个误区,坑一个人踩就可以了,希望看过本文的都有所收获避免踩坑。

THE END
1.目前主流的人工智能学习框架有哪些在人工智能的学习和开发中,选择合适的框架是关键。这些框架提供了核心工具和功能,帮助开发者构建和优化机器学习模型,提高效率,降低复杂度。目前主流的人工智能学习框架各有侧重,有些适合初学者快速上手,有些则针对专业研究者和工程师设计。接下来,我们详细介绍几个主流框架的特点和使用场景。 https://blog.csdn.net/Xhz181888/article/details/144437120
2.学不懂js可以直接学vue吗前端问答javascript 是 web 前端开发中不可或缺的一门语言,vue.js 是当前流行的前端框架之一。很多初学者在面对学习 vue.js 时,经常会听到这样的建议:「不懂 javascript,可以直接学 vue.js 吗?」。这个问题不是非黑即白的,需要分情况来看。 看你是否有 JavaScript 基础 https://www.php.cn/faq/512954.html
3.湖南统计信息网关于现代经济学的概念,我们把最近半个世纪以来发展起来的、在当今世界上被认可为主流的经济学称为现代经济学。现代经济学代表了一种研究经济行为和现象的分析方法或框架。 一、现代经济学的分析框架 作为理论分析框架,它由三个主要部分组成:视角(perspective)、参照系(reference)或基准点(benchmark)和分析工具(analyticahttp://tjj.hunan.gov.cn/bsfw/tjkp/tjjz/201507/t20150717_3824466.html
4.关于机器学习,这可能是目前最全面最无痛的入门路径和资源!李杰克尝试过Tensorflow、Mxnet和Keras三种框架,以使用Tensorflow为主,其他框架暂时没怎么接触。 今天重点要跟大家说的Tensorflow这个框架,Tensorflow背靠Google大树,是目前最火的框架,如果你想做一名AI工程师,那学Tensorflow一定是最好的选择,类似于一招鲜吃天下的意思。 https://www.36kr.com/p/5109465.html
5.学校安全先进个人事迹材料(通用17篇)二、层层签订安全工作责任书,构建安全教育框架 学校始终坚决贯彻执行县局下发的有关学校安全工作的文件精神及学校安全工作的各项规定,学校的各班级均制定了安全工作职责,班主任每学期都要作出本班切实可行的班级安全教育工作计划和总结,切实将安全工作作为第一要务来抓,学校也将此项工作的考核作为衡量教师工作绩效的重要https://www.ruiwen.com/xianjinshijicailiao/6159100.html
6.RPC框架:从原理到选型,一文带你搞懂RPC腾讯云开发者社区Thrift:thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++,Java,Python, PHP, Ruby, Erlang,Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。 https://cloud.tencent.com/developer/article/2021745
7.中世纪史学家格里:历史才是对“欧洲认同”最具威胁的事物联系与隔离:更广阔的框架 除此之外,研究中世纪早期的学者还受到跨区域、去中心化历史研究的影响,也就是,越来越多的西欧制度、社会和文化发展如今被纳入一个更宽广的欧亚历史的框架内来理解。这也就是后殖民历史学家如查克拉博蒂(Dipesh Chakrabarty)所说的“把欧洲地方化”(Provincializing Europe)的一部分。不过,查克https://www.thepaper.cn/newsDetail_forward_1478495
8.“宿舍文化圈”:大学室友对你的一生影响有多大?将宿舍作为本文的一个分析框架,可以跳出传统社会学在青年社会流动领域研究中集中于家庭背景、教育等结构性因素影响的讨论框架,构建一个新的研究载体。 宿舍在一定程度上打破了社会阶层在青年社会互动和交往中的聚合作用,将来自不同家庭和背景的同学联系在一起,在大学生活的几年中,青年可以在有限的范围内突破社会阶层的https://www.cqcb.com/manxinwen/manxinwen/2020-05-04/2374527_pc.html
9.PyTorch中文教程Python 优先的深度学习框架 PyTorch 手册说明 PyTorch 是一个 Torch7 团队开源的 Python 优先的深度学习框架,提供两个高级功能: 强大的 GPU 加速 Tensor 计算(类似 numpy) 构建基于 tape 的自动升级系统上的深度神经网络 你可以重用你喜欢的 python 包,如 numpy、scipy 和 Cython ,在需要时扩展 PyTorch。 https://www.w3cschool.cn/pytorch/
10.新技术·新成果——2021年度北京波谱年会之技术报告资讯中心报告题目: 配位聚合物框架结构材料中核磁的应用 万重庆教授简要介绍了固态核磁在配合物结构鉴定中的应用,包括在配位环境/结构、框架结构、相变及结构动力学方面的应用研究。并结合其课题组在这方面的研究进展,为固态核磁在配位聚合物材料的结构组成鉴定的实际应用提供范例。 https://www.instrument.com.cn/news/20130425/580258.shtml
11.3D点云数据开发的深度学习框架点云三维模型3D点云数据开发的深度学习框架 点云 三维模型 RGB-D 点云 何为点云? 点云的获取 点云的内容 点云的属性 点云目前的主要存储格式包括:pts、LAS、PCD、.xyz 和. pcap 等 相应基础算法库对不同格式的支持 三维点云有多种表示方法 相比于图像数据,点云不直接包含空间结构,因此点云的深度模型必须解决三个主要https://blog.51cto.com/u_12227/8777599
12.不学前端也可以做UI?机器学习UI框架Streamlit简介—入门配置不用学前端编程,你就能用 Python 简单高效写出漂亮的交互式 Web 应用,将你的数据分析成果立即展示给团队和客户 ——少数派 Streamlit 介绍 Streamlit是一个针对数据科学家设计的开源WEB框架,它可以使数据工程师能够围绕其数据,机器学习模型等几乎所有内容快速构建高度交互的Web应用程序。而且使用Streamlit开发自己的APP,只https://www.jianshu.com/p/46744bf46dd2
13.字节跳动破局联邦学习:开源Fedlearner框架,广告投放增效209%纵向与横向两种训练模式可以归约于一个框架,既一对 worker 各自执行一个神经网络,并通信中间结果和梯度。为了支持这种模式,Fedlearner 实现了一个基于 gRPC 的通信协议,并以算子的形式集成到 TensorFlow 中: bridge=bfl.bridge.Bridge(50051, 'localhost:50052')bridge.wait_for_remote_startup()g=tf.Graph()withhttps://maimai.cn/article/detail?fid=1550604028&efid=zqj9rqK7Yf_Us-lu-0Wnmg