前言

在写这篇文章之前,我曾对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. 网站banner无缝轮播

    网站banner无缝轮播 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  2. JS 模板引擎 BaiduTemplate 和 ArtTemplate 对比及应用

    最近做项目用了JS模板引擎渲染HTML,JS模板引擎是在去年做项目是了解到的,但一直没有用,只停留在了解层面,直到这次做项目才用到,JS模板引擎用了两个 BaiduTemplate 和 ArtTemp ...

  3. php动态更改post_max_size, upload_max_filesize等值

    在配置文件里 有些PHP 配置选项可以用int_set() 函数 直接在 项目里修改.但是有些值确不行.例如和上传文件有关的post_max_size和upload_max_filesize int_ ...

  4. jQuery实践树(2)

    上一个实践主要对jquery的ready事件进行.本实践要来使用jQuery改变页面的背景图片.可以先试试效果:http://hovertree.com/texiao/jquerytree/2/ 当你 ...

  5. CSS 框模型

    CSS 框模型 CSS 框模型概述 CSS 内边距 CSS 边框 CSS 外边距 CSS 外边距合并 一,CSS 框模型 (Box Model) 规定元素框处理元素内容.内边距.边框 和 外边距 的方 ...

  6. mysql环境搭建

    最近决定学习数据库,在比较了各个数据库之后,选择从mysql入手,主要原因: 开源 成熟,通用 用户量多,社区完善 入门简单 下载安装 mysql的官网下载地址:http://dev.mysql.co ...

  7. GIS公交查询-flex/java

    开发语言是flex.java,开发平台是myeclise.eclise,开发接口是arcgis api for flex,提供以下的功能: 1.站名-站名查询: 2.站点查询: 3.路线查询: 备注: ...

  8. NSString 的常用操作

    NSString *testStr01=@"HelloWord"; NSString *testStr02=[testStr01 substringToIndex:];//取头(从 ...

  9. GPU大百科全书索引(有助于理解openGL工作流程)

    GPU大百科全书索引 0.GPU大百科全书 前传 看图形与装修的关系 1.GPU大百科全书 第一章:美女 方程与几何 2.GPU大百科全书 第二章 凝固生命的光栅化 3.GPU大百科全书 第三章:像素 ...

  10. IOS开发基础知识--碎片19

    1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // 键盘显示完成后 UIKeyboar ...