移动网络下高可靠即时通信系统的研究与应用
时间:2017-01-15
随着移动互联网时代的到来,涌现出众多优秀的即时通信软件,但成熟的即时通信技术往往不公开,而开源的即时通信框架存在较多问题,如丢包和信息延迟。针对这些问题,我们设计了移动网络下高可靠即时通信系统,弥补了开源通信框架的不足,并提出对通用即时通信链接进行高性能优化,同时改进通信链路堆放策略。
随着移动网络的发展,网络聊天、视频和语音在网络通信中越来越受重视,从网络通信应用软件的用户量可以看出,网络即时聊天功能具有良好的用户体验。在新开发的各类软件尤其是手机应用软件中,基本都会附带即时通信功能。这是一种发展趋势,网络通信已经成为了用户沟通的重要手段,渐渐地取代了传统的书信、短信等通信方式,使用的用户越来越多,同时用户对即时通信技术的稳定性要求也越来越高。但由于成熟的即时通信技术不开源,而开源的即时通信技术只实现了基本的建立链接,数据传输并没有做任何优化,使得在使用过程中经常出现消息延迟、消息丢失等情况。
1 消息的即时传输
良好的用户体验对即时通信系统的消息传输具有较高的要求,尤其是消息的即时性。但在某些情况下,服务器并不能即时地将信息推送给接收者,存在着两种主要情况。
(1) 客户端与服务器之间的通信长链接不稳定。服务器资源限制和网络问题的影响是客观存在的,从理论的角度没有办法避免。但可以从其他方面解决通信链接的稳定性对消息即时传输产生的影响。提出的高性能长链接、通信链接的检测和通信链接的恢复方法,有效地利用了服务器的资源,并保证链接断开后能够快速的恢复,从而保证消息的即时传输。
(2) 同一时间服务器需要推送的消息量较多。服务器转发消息也需要消耗时间,当同一时间进行即时通信的用户较多时,服务器来不及转发新接收的消息,导致了消息的阻塞,从而影响了消息的即时性。因此采用消息的并发推送方法解决消息阻塞的问题。
1.1 高性能通信长链接
用户量的不断增加,服务器需要存储的通信链接越来越多,但一些通信链接在某些时候并不会被使用。通过分析得出客户端与服务器之间建立的通信长链接并不会随时都被利用,某些时间会处于空闲状态,为此提出了高性能通信长链接,尽量地减少客户端空闲状态下的链接时间,提高服务器的资源利用率,保证用户量剧增时通信链接不会因为服务器的资源限制而断开,从而保证消息的即时传输。为了建立高性能通信链接,使用时间片轮转的算法。把用户开始登陆客户端的时间或者用户发送消息的时间记为开始时间,从开始时间起,把时间分为等长的时间片段假设得到的时间片段如图1所示。其中黑色区间表示在这个时间片段内用户有消息需要接收。白色的区域表示用户处于空闲状态没有消息需要接收。时间片轮转算法的目的是保证用户使用即时通信需要接收消息时,客户端与服务器存在通信链接。而用户没有使用即时通信时,客户端与服务器之间不存在通信链接,从而释放了服务器的资源。时间片轮转算法的规则如下: (1) 当客户端需要接收消息时,当前时间片为忙碌状态。相反如果没有消息需要接收,则当前时间片处于空闲状态。当用户登录软件后,默认第一个时间片为忙碌状态,并且客户端向服务器发送建立通信链接的请求。
(2) 如果当前时间片客户端处于忙碌状态,那么接下来的个时间片客户端都将主动向服务器端发送建立链接的请求。
(3) 如果当前时间片的前个时间片处于空闲状态,那么当前时间片的链接状态与前一个时间片的链接状态相反。例如前一个时间片客户端与服务器有通信链接,那么当前时间片客户端将向服务器发送断开链接的请求。
(4) 如果当前时间片的前个时间片中的任何一个时间片客户端处于忙碌状态,那么当前时间片客户端将向服务器发送建立链接的请求。
1.2 通信链接的检测和恢复
为了保证消息的即时传输,提高服务器长链接的效率,保证服务器与客户端链接稳定,避免意外中断情况的出现,采用有效的长链接检测方法和消息恢复方法。理论上称客户端发送询问信息的过程为心跳过程,心跳时间指客户端向服务器发送询问信息的间隔时间。为了避免客户端频繁地发送心跳信息,消耗能量,或者避免心跳时间过长,导致消息传输的延迟。本文提出了心跳时间衰减函数如下:
(1)
式中:表示第时刻的心跳时间;表示第时刻的心跳时间;和表示时间衰减系数都是常量;表示最短的心跳时间间隔,同样也是一个常量;表示最长的心跳时间间隔,也是一个常量;new表示客户端发送了新的消息或者是服务器向客户端推送了新的消息。心跳机制和时间片轮转结合后,客户端只有处于忙碌状态时才会发送心跳信息。这样既保证了通信链接的稳定,又节约了服务器的资源。
1.3 客户端通信恢复机制
当客户端启动后,在客户端的后台会启动两个线程,在Android中使用Service服务,Service相当于Activity,只是没有界面而是运行在后台的服务。其中一个线程按照定时器的设定不停地向服务器发送心跳信息,确认客户端与服务器的通信链接是否正常。另外一个线程用于监听服务器,接收服务器推送的消息。通过心跳机制,当客户端检测到与服务器的通信长链接断开时,需要向服务器请求再次建立链接以及获取离线数据。
为了进一步降低服务器的数据处理压力,提升用户体验。提出了一种获取离线消息的方法,通过短链接的方式获取离线消息。短链接指的是客户端向服务器发送请求会携带必要的参数,而服务器做出响应时也会把客户端想获取的数据返回,当客户端得到数据后链接就断开,如图2所示。
1.4 消息并发推送
如果某一时刻发送消息的用户较多,而服务器来不及把消息推送给目标客户端,那么就会造成服务器需要推送的消息越来越多,最终导致服务器消息的阻塞。消息阻塞虽然不会导致消息的丢失,但是会严重影响消息的即时传输,会给用户带来特别不好的使用体验。
为了解决这个问题,在服务器端使用了消息的并发机制。当服务器从客户端接收到一条新的消息后,把消息存放在本地数据库的同时也会把消息存放进一个队列。而在服务器的后台,即时通信系统会根据服务器处理器的使用情况开启若干个线程,每一个线程所做的操作都相同,从队列中取出一个消息,然后根据消息中的目标地址,查询与其是否有通信链接,如果存在则把消息推送给客户端,如果不存在则不做任何处理。这样服务器可以在同一时间推送多条消息,有效地利用了服务器的资源,降低了消息阻塞的可能性。
2 消息的可靠传输
2.1 消息握手协议
为了确保消息在传输过程中不会出现丢失,提出了消息传输的握手协议。握手协议分为客户端给服务器发送消息的握手和服务器给客户端推送消息的握手。握手协议的本质是客户端与服务器端约定的消息传输规则,握手的主要目的就是为了确保消息不会丢失。
(1) 正向握手协议
正向握手协议是指客户端向服务器端发送消息时消息的确认协议。客户端需要发送消息时,会先把消息存放在本地数据库中,然后再调用发送消息的接口,存入本地数据库中的消息标记为未发送。如果服务器成功接收到消息,会给客户端返回一个包含了消息ID的反馈信息,表示自己已经接收到消息,客户端接收到反馈信息后,根据ID把本地数据库中的消息标记为已经发送,这样就完成了一次客户端到服务器的握手。如果没有接收到服务器的反馈信息,那么客户端将继续向服务器发送这条消息。
(2) 反向握手协议
反向握手协议指的是服务器端向客户端推送消息时消息的确认协议。当服务器接收到客户端的消息后,首先会把消息存在数据库中,然后从消息中解析出接收人的地址信息,然后根据地址信息查找目标客户端与自己是否有通信链接。
2.2 文件传输协议
为了避免使用通信长链接传输文件,提出了文件和文件地址相分离的传输方法,文件存储服务的提供商会提供文件上传的相应接口,客户端通过调用接口,上传文件后,会得到一个文件的网络地址,通过该网络地址用户就可以直接下载文件。
3 高复用架构
3.1 服务器
消息即时传输系统具有高复用性,就不能与应用软件的功能结合,本文提出了单系统双服务的系统架构。单系统指功能完全的应用软件系统,而双服务指为应用软件提供了后台服务的两套服务系统:消息的即时通信系统和数据功能处理系统。这样把消息和软件功能分离后,就可以使消息的即时传输服务在任何应用软件中使用,其功能模块如图3所示。 为了保证消息后台服务器的安全性,本节提出了双服务权限认证的方法。为了叙述简便,把消息后台服务器简称为消息系统,而应用软件的数据处理服务器简称为功能系统,如图4所示。通过这种方式,不仅增加了通信系统的安全性,同时也做到了功能的分离,使即时通信系统的后台通用性更高。
3.2 客户端
客户端和服务器的设计思想类似,单独把即时通信的功能打包封装,仅对外提供数据的操作接口,如图5所示。客户端的即时通信主要包含五个功能:发送建立链接的请求;发送消息;接收消息;发送心跳信息;断开通信链接,用户退出系统时会调用断开通信链接的功能,用于释放服务器的资源。应用程序的客户端添加即时通信的功能包后,只需要根据自己消息格式修改对本地数据库的操作,对外提供的接口不变。
4 系统测试
4.1 测试系统介绍
测试系统的主要功能是用于学校老师、学生家长和学生之间的沟通,为学校管理学生带来便利。同时也包含了即时通信的功能模块,用于用户之间的交流沟通,发送团队公告信息和发送申请加入团队的申请信息。
应用系统在添加即时通信功能时,采用了本文设计的即时通信框架。后台使用了双服务器设计,提供了一个独立的消息系统和一个功能系统,两个系统之间使用同一个权限缓存。消息系统主要负责处理与客户端的消息通信,功能系统使用的是短链接,为客户端提供了获取数据的接口。客户端加入了即时通信包,并按照自己的需求对数据存储格式和数据读取格式做了修改。
服务器的配置是2 GB内存、双核、2.6 GB的主频,2 MB的网络带宽,客户端使用Android系统的手机。把一个客户端叫A,另一个客户端叫B。
4.2 实验结果
测试过程中通过改变客户端的工作状态来模拟用户的各种使用情况。
测试1:参数设置:客户端A、客户端B同时登陆系统,客户端A给客户端B发送消息。测试结果:客户端B能正常接收到客户端A发送的消息。
测试2:参数设置:客户端A、客户端B同时登陆系统,客户端A和客户端B同时给对方发送消息。测试结果:客户端A和客户端B都能正常接收到对方发送的消息。
测试3:参数设置:客户端A登陆系统,向客户端B发送消息。客户端B在客户端A发送消息后,登陆系统。测试结果:客户端A发送消息成功,客户端B正常接收到客户端A发送的消息。
通过用例测试,应用程序中的即时通信功能在很多情况下正常使用,满足了本文对即时通信框架功能的要求。
压力测试中,设置3个测试参数,并发人数、每个客户端共发送消息的条数、每两条消息发送的时间间隔(单位:ms)。对私人聊天、群聊天和发送通知进行了压力测试,消息发送和接收的成功率都在100%。但也有消息发送和接收不到100%,甚至有88%的成功率。通过分析可以发现,当消息发送成功率不高时,客户端的在线人数和发送消息的量普遍偏高,发送消息的频率也较快,而且发送成功率和这几个参数之间还有反比的关系。
因此可以得出结论,当消息发送成功率过低时,可能是受到了服务器硬件资源的限制。因为在线人数过多时,客户端需要和服务器建立的通信长链接较多,如果同时还有多人发送群信息或者公告,那么服务器的资源将被消耗殆尽。因而会有一些通信链接中断或者消息被阻塞。
5 结 论
即时通信是网络聊天的核心技术,本文从消息即时传输、消息可靠传输和高复用框架三个方面对现在的即时通信提出了改进方案。文中高性能通信长链接有效地解决了普通通信长链接消耗资源的问题,并且消息传输效果并不会比普通通信长链接差。同时,在通信链接的检测方法中提出了一个更加节约资源的心跳算法。加入了更高效的文件传输,利用第三方文件服务使文件传输更加可靠。然后,基于高复用框架设计了即时通信框架,减少了应用软件开发的周期。最后通过对即时通信系统的功能和性能的测试,充分证明了本文设计的即时通信系统可靠性较高,完成了对即时通信系统的研究。
参考文献
[1]辜蔚君.关于人力资源数字化转型中数据管理工作的思考[J].厦门科技, 2023(1):43-47.
