对于移动APP来讲,IM功能正变得愈来愈重要,它可以建立起人与人之间的链接。社交类产品中,用户与用户之间的沟通能够产生出更好的用户粘性。
在复杂的 Android 生态环境下,多种因素都会形成消息推送不能及时达到客户端。另外,不稳定的移动网络也给数据传输的速率和可靠性增长了障碍。
本文详解了 网易云信IM SDK在应对弱网环境、移动端硬件限制以及Android复杂的生态现状时的探索与心得.如何实现不影响用户体验的后台保活,改善的长链接加推送组合方案,以及在弱网环境大数据传输的优化实践。
网易云信即时通信推送保障及网络优化详解(三):如何在弱网环境下优化大数据传输算法
对于IM来讲,及时的消息推送和较低的电量消耗也并不是不可兼得。在传统上,每一个IM客户端都会各自维护一条与服务器的长链接,本身的消息和信令都在这条长链接上传递,每一个APP也独自去心跳,断线重连等事情。缓存
这种模式比较简单,不一样的APP也是彻底隔离的,不会互相影响。但他的缺点也很是明显:安全
首先是作了不少重复的事情,形成了流量和电量的无谓消耗;服务器
第二是要保证全部的进程都能在后台运行很难。网络
优化的方向也就很是明显了,那就是共享链接,如今绝大部分推送SDK也是这么作的。从这些APP里面选出一个当前正在运行的,或者是被杀几率最低的APP做为总代理,只由这个代理和服务器创建链接,一个手机上的全部其余APP都经过这个代理中转与服务器通讯。负载均衡
可是,IM有一个很基本的要求在这种模式下没法获得知足:安全。全部APP的消息都通过代理中转,代理到服务器的链接是加密的,安全的,但到了代理这里,消息都被解开了,所以代理理论上能够看到其余全部APP的来往消息。所以,这种共享长链接的方式并不适用于IM。大数据
虽然共享长链接方式不合适,但仍然提供了一个优化的思路。在此基础上,有另外一个能够脱敏共享链接的方式:安全长链接加推送链接模式。优化
每一个APP在使用和真正传递数据时,仍然独立使用本身的安全长链接。而当APP退到后台一段时间以后,则断开长链接,而后每一个APP开启一个推送代理,并选择其中一个和网易云信的推送服务器创建链接,以后当APP有新消息时,就经过这个推送链接传递。加密
APP能够本身控制发出的推送消息的安全级别,能够是包含说话人和消息内容,能够只包含说话人,或者只是一条简单的有新消息到达的提醒文案。推送到达后,若是是代理APP本身的消息,直接传递给代理APP便可。代理
若是是其余APP消息,前面说到过,直接唤醒可能会失败,并且会致使无谓的电量消耗,因此这里并不直接将提醒传递给目标APP,而是由带来发出一条通知栏提醒。等用户去点击通知栏提醒后,才会把目标APP唤醒。
如今国内的ROM中,华为和小米的系统原本是带有推送系统,且开放给了第三方APP的。在这两个系统上,使用系统的推送通道明显会更加稳定,也更加节省资源。所以在MIUI上,从长链接到推送通道的切换流程仍然和前面的同样,只是再也不使用本身的推送链接,而是将消息转发到MIUI的推送服务器,而后转给MIUI系统的推送代理,而后传递给网易云信的APP。
华为的推送系统流程也是同样。不过如今华为和MIUI在推送实现上有一些区别,例如MIUI的通知栏提醒是在本身的推送代理里完成的,而华为倒是将提醒通知交给APP本身去完成的,另外,他们的通知栏提醒的管理接口也有不少区别。
在APP没有被禁用的状况下,二者均可以收到推送,而若是APP已经被禁用了,MIUI的通知栏提醒方式还能够将推送送达,而其余的推送方式则不能送达了。
以上就是在保障消息推送方面所可以作的全部事情了。若是之后有更多的系统开放本身的推送系统也能够选择逐步接入,以提升推送到达即时性,减小资源消耗。不过相应的,也要承受不断加入各类系统的推送SDK,增大发布包体积的缺点。
移动通讯网络的三个特色:
第一个是慢,尤为是2G,3G网络,慢的使人发指。
第二个是断,手机跟着人不停的移动,网络也不停的在切换,从wifi到移动网络,从一个基站到另外一个基站,从有信号到没信号,均可能致使网络中断。有些制式的网络,接打电话也会致使数据网络断开。另外,移动基站还有NAT超时,到一个链接上长时间空闲后,基站就会默默的将链接断开,没有任何通知。
第三个是贵,这个就不用多说。
在网易云信整个通讯系统中有3种类型的链接:TCP,UDP,HTTP。虽然说这三个并非同一层的协议,不过毕竟都在应用的更下层,所以这么划分也无妨。3种类型的协议对应了不一样的业务应用。TCP主要是用户长链接,也就是普通IM消息和信令的传输,UDP用于传输实时音视频数据流,而HTTP则主要用在音频,图片等文件的上传下载上。对于不一样的业务,SDK优化的关注点会有一些不相同。
第一个是协议的选择。前面说,长链接的使用量是最大,选择一个合适的协议相当重要。若是是刚开始接触IM开发,通常会选择一些开源的协议,好比XMPP,SIP等。这是XMPP协议的一个请求样例,能够看到是一段XML格式的文本数据。
这是基于SIP的SIMPLE协议的一个请求样例,能够看到是一段相似HTTP协议的文本数据。这些协议的优点在于开源,有成熟的解决方案可使用,扩展性好,甚至还能够和其余系统互联互通,协议的可读性也很是好。可是在广泛比较臃肿,冗余字段不少,在昂贵的移动网络里面用起来会比较浪费。网易云信采用的是私有的二进制协议,这是一个请求的数据样例,这里是把二进制数据转为了16进制显示出来,每一个字节这里显示为两个字符。能够看到二进制协议的特色在于彻底失去了可读性,可是,却带来极高的表达效率,相对于文本协议,能够节省很是多的数据流量。
另外一个例子是登陆的优化。因为移动网络常常断开,因此登陆经常是心跳以外交互最多的协议了。使用量越大,优化就越有意义。通常而言,登陆会通过这么几步。
第一步是LBS。这里的LBS不是常常说的基于地址位置的服务,在不一样的厂商可能也有不一样的叫法,反正做用都是获取服务器的IP地址。像云信这种须要提供全球服务的系统,在世界各地都要部署服务器,用户登陆时,确定要选择一台最优的服务器接入服务。经过lbs,客户端能够获取离本身最近,连通性最好的服务器链接机IP地址,服务器也能够据此作负载均衡。
拿到服务器链接机IP后,客户端就去链接该服务器。
链接成功,须要有一次握手。这个握手不是TCP的三次握手,而是为了创建安全链接,同服务器协商加密算法和加密密钥。
而后就发送登陆请求,这里会带上用户认证信息,本机设备信息等数据。
登陆成功以后,就是同步数据,包括离线消息,用户信息,群组信息等。通常而言,这里不会去作全量同步,而是采用基于时间戳的增量同步。
在移动网络上,每一次交互都须要比较长的时间,同时,每一次网络请求电量消耗也是很大的。因此,优化的方向就是尽可能减小交互次数,而方法则是合并请求,并行操做以及省略请求。
LBS和链接这两个步骤是能够并行完成的。若是前面已经获取过LBS,这里能够有以前的缓存地址,若是没有,能够先连一个默认地址。
其次是握手和登陆也能够并行操做。在握手包中,就能够把加密后的登陆包直接带上去了。若是是断线重连,网易还能够简化登陆,直接带上上一次登陆的会话ID,一来减小服务器鉴权压力,二则能够直接带回在断线期间是否有未读消息等数据,若是没有,则能直接将同步这一步省略掉。若是有,同步也能够只作部分同步,只去拉去离线消息便可。等到APP切换到前台,才去同步其余的信息。
经过这些优化,登陆时间能够降为原来的1/2到1/3,登陆的流量消耗也能够节省30%左右。