物联网平台设计心得:管中窥豹之HeartBeat
前言
在写这篇文章之前,我曾对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来检测聊天用户的掉线问题。
物联网平台设计心得:管中窥豹之HeartBeat的更多相关文章
- 物联网平台设计心得:你所不知道的CRC校验
在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...
- 物联网平台设计心得:DateTimePicker实现选择联动
所谓的选择联动,就是指,当我DateTimePicker1选择2月4号的时候,我DateTimePicker2只能选择2月4号和2月5号两天,当然你可以自行规定要选择的日期.这在一些图表查询条件里面是 ...
- 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网平台
天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...
- 阿里云物联网平台体验(树莓派+Python篇)
阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...
- 读懂SAP Leonardo物联网平台
读懂SAP Leonardo物联网平台 https://blog.csdn.net/weixin_42137700/article/details/81903290 本文比较系统.全面地介绍了SAP ...
- 如何实现PLC与THINGWORX工业物联网平台对接
物联网(Internet of Things),简称 IoT,对于制造商来说,是行业乃至世界范围内的一股变革浪潮.在我们设计和制造的产品中,将会不断嵌入各种软件.传感器和启用 IP 的连接功能.IDC ...
- 国外物联网平台(8):Telit
国外物联网平台(8) ——Telit 马智 定位 We Bring IoT to Life Telit提供世界上最全面的高性能物联网模块.连接服务和软件. 产品体系 模块 Telit提供丰富专业的物联 ...
- 国外物联网平台(7):FogHorn
国外物联网平台(7) ——FogHorn 马智 引言: 据外媒在本月20日报道,硅谷初创公司FogHorn正在与谷歌合作以简化工业物联网应用的部署.本文对FogHorn的技术.产品.应用和生态进行了分 ...
- 国外物联网平台(6):Electric Imp
国外物联网平台(6)——Electric Imp 马智 公司背景 Electric Imp成立于2011年,公司设立在美国加利福尼亚州洛斯阿尔托斯和英国剑桥 公司投资者包括:富士康技术集团.PTI创投 ...
随机推荐
- 理解CSV文件以及ABAP中的相关操作
在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...
- 用SourceTree合并工程冲突,工程打不开时的操作
1.右键工程 --> 显示包内容 2.打开project.pbxproj文件 3.command + F :搜索“<<<<<” 或“>>>> ...
- Linux0.11内核--加载可执行二进制文件之1.copy_strings
从现在开始就是分析最后的核心模块exec.c了,分析完这个文件后,就会和之前的所有分析形成一个环路,从创建进程.加载进程程序到进程调度.内存管理. exec.c的核心do_execve函数很长,而且用 ...
- React Native知识4-Image组件
一个用于显示多种不同类型图片的React组件,包括网络图片.静态资源.临时的本地图片.以及本地磁盘上的图片(如相册)等 一:属性 1:onLayout function 当元素挂载或者布局改变的时候调 ...
- 熟悉HTML CSS布局模型
HTML最难的地方来了!这个我反复了很多遍, 包括现在写博客, 也对我自己算是一种温习, 我这块怕是没办法写的很好懂, 因为我自己还不能把我学到的准确通俗易懂的表达出来, 给自己记个笔记, 以后再来一 ...
- javascript 常见方法记录
1,trim():去除字符串左右两端的空格,在vbscript里面可以轻松地使用 trim.ltrim 或 rtrim,但在js中却没有这3个内置方法,需要手工编写. <script langu ...
- SQL SERVER 2000通过链接服务器发送邮件出现错误
案例环境: 服务器A系统: Windows Server 2000 数据库版本 : Microsoft SQL Server 2000 - 8.00.2282 (Intel X86) 服务器B系统: ...
- 【SQL篇章--DATABASE/EVENTS】
[SQL篇章][SQL语句梳理 :--基于MySQL5.6][已梳理:DATABASE/EVENTS][会坚持完善] 目录: 1. Data Definition Statements: 1.1 ...
- 从零自学Hadoop(12):Hadoop命令中
阅读目录 序 HDFS Commands User Commands Administration Commands Debug Commands 引用 系列索引 本文版权归mephisto和博客园共 ...
- SQLSERVER自动定时(手动)备份工具
最近项目需要,写了一个小工具软件: 1.实时显示监控 2.可多选择备份数据库 3.按每天定时备份 4.备份文件自动压缩 5.删除之前备份文件 直接上图 1.备份监控界面: 2.数据库设置: 附工具下载 ...