前言

在写这篇文章之前,我曾对HeartBeat做过诸多的研究,也做过诸多的项目,在这些项目中,有客户端为了维持状态,而定时向服务端发送的HeartBeat;有服务端为了维持客户端连接状态而处理HeartBeat等,但是怎么说,无外乎两种状态,HeartBeat要么存在于客户端,要么存在于服务端,其本身具有无状态性,不和数据库进行任何交互,上一条HeartBeat和下一条HeartBeat无特别的必然联系。

那么,HeartBeat究竟是什么,有什么表现形式呢?

首先,HeartBeat从字面意思上解释,就是心跳,心跳都是有一定规律的,比如说,3秒跳一次,5秒跳一次,甚至60秒跳一次等。所以说,HeartBeat的基本单位一般都是以秒来计数的。并且两次HeartBeat间隔的时间不能过长,如果间隔时间过长,比如说两三个小时跳一次,那么HeartBeat也就失去了它本来的意义了,至于原因的话,我方后面讲。它在程序中,主要是为了检测状态的,比如在客户端,连接到服务端后,每隔10秒钟会上传一次心跳包,服务端接收到此心跳包,就会拆包分析,然后重置客户端的心跳计数,如果连续3次,或者4次没有收到客户端传来的心跳包,那么就视为客户端掉线。有人可能就说了,客户端下线的时候,直接向服务端发送一个下线通知不就行了,还用什么心跳包来检测掉线呢? 其实不然,客户端的掉线,是有多种情况的,每个用户不一定都会发送掉线通知,比如他们家里停电了,或者电脑重启了,或者浏览器崩溃了等等,这些情况下客户端还没来得及发送掉线通知就挂了,所以增加心跳检测是应对这种掉线的比较好的方式,它有助于让服务器保存活动的客户端连接,去掉死链,从而提升性能,规避风险。

上面的这种方式,我们可以用下图的流程来表示:

其次,就是HeartBeat的表现方式,在不同人的程序里面,是不同的,但是肯定相同的地方在于,他们都会有心跳标识符的。比如我这里规定和服务端的通讯协议:  信息头|功能码|数据部分|CRC ,其中功能码 006就代表心跳包。那么在客户端我就会这样封包: dst|006|datadata|0013 然后发送给服务端,服务端收到信息后,先进行CRC校验以便确定信息的正确和完整性,然后通过拆包得知客户端传来的是心跳包,那么就会将对应的客户端里面的心跳计数重置即可。其实就是这么简单。

这只是比较普通一些的心跳,对于不同的业务系统来说,可能会有不同的表现形式,比如对咱们RSA系统来说,如果要想重构这种心跳包,需要为不同的activity类型规定不同的心跳包,比如对于按钮点击,我们可以专门定义一个按钮点击心跳包;对于拖拽,我们可以定义一个拖拽心跳包等,服务端接收以后,能够处理。并且这种心跳包的传输是基于socket传输的,而不是目前的借助于数据库,在性能上和多样性方面,更加的高效。之所以RSA在以前没有采用这种方式,应该是当时还没有websocket吧。

最后我们需要说到的一个问题就是HeartBeat频繁的发送会不会在业务拥塞的时候,造成性能问题。针对这种场景,已经有了适合的解决方案,那就是在业务场景拥挤的时候,我们只需要将HeartBeat的发送和处理放到其他线程上即可,并且改变HeartBeat的发送时长,比如从原来的十秒,改成现在的三十秒,这样就能在很大程度上提高性能;当业务不拥塞的时候,我们就可以把HeartBeat的发送和处理放到业务线程上,并适当减少HeartBeat的发送时间,也都是可取的。这种配置如果做成可自动切换的,就更好了。

实际例子

我们讲了这么多,接下来看看例子。这个是我写的一个小DEMO,用HeartBeat来检测聊天用户的掉线问题。

基于SignalR的小型IM系统

物联网平台设计心得:管中窥豹之HeartBeat的更多相关文章

  1. 物联网平台设计心得:你所不知道的CRC校验

    在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...

  2. 物联网平台设计心得:DateTimePicker实现选择联动

    所谓的选择联动,就是指,当我DateTimePicker1选择2月4号的时候,我DateTimePicker2只能选择2月4号和2月5号两天,当然你可以自行规定要选择的日期.这在一些图表查询条件里面是 ...

  3. 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网平台

    天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...

  4. 阿里云物联网平台体验(树莓派+Python篇)

    阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...

  5. 读懂SAP Leonardo物联网平台

    读懂SAP Leonardo物联网平台 https://blog.csdn.net/weixin_42137700/article/details/81903290 本文比较系统.全面地介绍了SAP ...

  6. 如何实现PLC与THINGWORX工业物联网平台对接

    物联网(Internet of Things),简称 IoT,对于制造商来说,是行业乃至世界范围内的一股变革浪潮.在我们设计和制造的产品中,将会不断嵌入各种软件.传感器和启用 IP 的连接功能.IDC ...

  7. 国外物联网平台(8):Telit

    国外物联网平台(8) ——Telit 马智 定位 We Bring IoT to Life Telit提供世界上最全面的高性能物联网模块.连接服务和软件. 产品体系 模块 Telit提供丰富专业的物联 ...

  8. 国外物联网平台(7):FogHorn

    国外物联网平台(7) ——FogHorn 马智 引言: 据外媒在本月20日报道,硅谷初创公司FogHorn正在与谷歌合作以简化工业物联网应用的部署.本文对FogHorn的技术.产品.应用和生态进行了分 ...

  9. 国外物联网平台(6):Electric Imp

    国外物联网平台(6)——Electric Imp 马智 公司背景 Electric Imp成立于2011年,公司设立在美国加利福尼亚州洛斯阿尔托斯和英国剑桥 公司投资者包括:富士康技术集团.PTI创投 ...

随机推荐

  1. hadoop 集群的配置

    在经过几天折腾,终于将hadoop环境搭建成功,整个过程中遇到各种坑,反复了很多遍,光虚拟机就重新安装了4.5次,接下来就把搭建的过程详细叙述一下 0.相关工具: 1,系统环境说明: 我这边给出我的集 ...

  2. 轻量的、可自定义 CSS 的 Lightbox 相册插件

    jQuery LightGallery是一个轻量级的,可定制的,模块化的,响应式的 jQuery 相册插件.它采用 CSS 来实现图像和视频的大小调整.因此,这将是非常灵活的,并且比使用 JavaSc ...

  3. Atitit.去除水印的方案

    Atitit.去除水印的方案 1.1. 查找水印的位置 Kegwa imgd posit zo ok le .. Auto find d zo troub ...manu easy 1.2. 还原去除 ...

  4. 添加 All Exceptions 断点后, 每次运行都会在 main.m 中断的一种解决方法

    在本人项目添加导入和使用新的字体过程中,遇到一个很奇怪的问题: 项目开启了全局断点,但是每次启动都会运行在mian.m中断,点击下一步程序继续正常运行. 不知道是什么原因,于是google百度寻找答案 ...

  5. python之(re)正则表达式上

    python正则表达式知识预备 正则表达式使用反斜杠" \ "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \\\\ "表 ...

  6. Session 失效原因

    转载http://blog.csdn.net/LLorJJ999/article/details/4107464 昨天去GTSC面试,有面试官问我关于Session丢失之后怎么查的问题,说老实话,开发 ...

  7. Java调优知识汇总

    查看java进程运行状况jps -lvm 查看java默认堆大小 java -XX:+PrintFlagsFinal | grep MaxHeapSize eclipse调试设置vm参数 在项目上右键 ...

  8. border 外边框

    语法: border:<line-width> || <line-style> || <color> <line-width> = <length ...

  9. Linux备份ifcfg-eth0文件导致的网络故障问题

    今天在给一台操作系统为Oracle Linux Server release 5.7的服务器配置网络时,遇到了备份ifcfg-eth0配置文件,导致网卡无法绑定IP地址的情况.觉得是个有意思的案例,特 ...

  10. SQL SERVER中隐式转换的一些细节浅析

    其实这是一篇没有技术含量的文章,精通SQL优化的请绕道.这个缘起于在优化一个SQL过程中,同事问了我一个问题,为什么SQL中存在隐式转换,但是执行计划没有变? 我思索了一下,觉得这个问题也有点意思,说 ...