IM & Network

Android微信智能心跳方案(转载)

2017-06-23  本文已影响98人  画十

原文链接

前言


好了,废话了很多,下面分享一下微信的智能心跳方案细节。

主要目标

本方案的主要目标是,在尽量不影响用户收消息及时性的前提下,根据网络类型自适应的找出保活信令TCP连接的尽可能大的心跳间隔,从而达到减少安卓微信因心跳引起的空中信道资源消耗,减少心跳Server的负载,以及减少部分因心跳引起的耗电。
主要方法是参考WhatsApp和Line中有价值的做法,结合影响TCP连接寿命的因素,实现Android微信后台自适应心跳算法,同时使用GCM作为辅助通道增加新消息通知的可靠性。

WhatsApp、Line、微信的Push策略分析
  1. WhatsApp
    在不支持GCM的设备上,采用和微信类似的长连接+心跳策略,WIFI和手机网络下的心跳间隔都为4分45秒,心跳5次后,主动断开连接再重连。
    在支持GCM的设备上,主要靠GCM来激活WhatsApp,WhatsApp启动后,会建立一个与服务器的长连接,直接通过此长连接发送Push消息,这个长连接10分钟无消息就会主动断掉,且这十分钟内不做心跳,断掉后WhatsApp客户端和它的服务器不再有连接。当有消息时候,服务器发现没有长连接会发送GCM消息,手机收到GCM消息后,会重新建立长连接来收取消息,10分钟无消息会再断开,如此循环。
  2. Line
    从测试中发现Line在国内、台湾、美国使用了不同的策略。
  3. 美国(使用GCM):
    启动时,会保持7分钟心跳(CDMA2000网络)维持长连接半小时,之后主动断开长连接。当有消息时,服务器会发送GCM消息,Line客户端接收到GCM消息后,重新建立长连接,并再次用心跳维持半个小时。
  4. 国内(不使用GCM):
    在国内,同样帐号在相同网络,不同的手机上测出了两种策略:
    1. 长连接+心跳策略*(在Galaxy S3上使用),心跳间隔WIFI下是3分20秒,手机网络是7分钟。
    2. 轮询策略(在红米和Nexus S上使用),如图2-1所示。与心跳策略的主要区别用红色标出,客户端在长连接建立后也会定时发送请求,Server会回复并且同时关闭长连接。客户端等待轮询间隔T1后再次建立TCP连接。Line会根据手机的活跃状态动态调整T1,调整范围是从最小1分到最大到2小时半。而长连接存活时间T2比较固定,在WIFI下4分钟,手机网络7分钟。如果在T2时收到新消息会延长T2的时间。



      图2-1 Line在国内的轮询策略

  5. 台湾(不使用GCM):
    从IBG同事win和guang提供的测试数据中看到,台湾使用的策略跟国内的轮询策略类似。
  6. 微信
    微信没有使用GCM,自己维护TCP长连接,使用固定心跳。
心跳典型值
WhatsApp Line GCM
WIFI 4分45秒 3分20秒 15分钟
手机网络 4分45秒 7分钟 28分钟
Line、WhatsApp、微信Push策略的优点
  1. 微信:当前心跳间隔比竞品短,所以微信在新消息提醒上会最及时。
  2. 使用GCM:Line和WhatsApp使用GCM策略的最大优点就是省电,以及减轻系统负荷(减少后台应用数目)。
  3. Line:Line的轮询策略,优点是当Line处于活跃状态时,及时收消息。当Line处于不活跃状态时,省电。
Line、WhatsApp微信Push策略的不足
  1. 微信当前心跳频率相对竞品较大,在耗电、耗流量,占用信令通道等方面有所影响。
  2. Line的轮询策略,导致的问题是消息可能会延迟接收,测试发现最大延迟间隔到2.5小时。
  3. WhatsApp和Line使用Push拉起一个定时长连接策略,缺点是要依赖Google的Push服务,如果Google的Push服务不稳定,消息也会延迟接收。
  4. 在国内的移动和联通2G网络下,由于运营商的策略,GCM长连接频繁断连,WhatsApp的Push消息很不及时,体验非常差。
GCM研究
  1. GCM特点
  1. GCM心跳策略以及存在的问题
  1. GCM的可用性及稳定性
    目前测试发现GCM在国内可用性不高,原因有:
  1. GCM Server类型
    GCM提供两种Server模型:
微信可能的改进点探讨

微信Push的优化主要有几个优化点:

  1. 公共Push通道
    由于GCM在国内的可靠性很低,现在国内Android上的Push基本上是各自为政,很多软件都自己实现Push。导致手机被经常性的唤醒,耗电耗流量严重。
    市面上已经有很多第三方的公共推送服务,大家可以选择一个适合自己应用的推送服务。腾讯也有信鸽和维纳斯组件,大家在选择方案的时候可以对比下。
    最终因为我们国内外使用一套方案,并且是辅助公道,所以我们选择使用GCM。
  2. 使用GCM Push作为辅助通道
    * 当前使用GCM的成本不大,可以使用GCM作为辅助通道来增加新消息的及时性。
    * 使用GCM作为辅助通道,在支持GCM的设备上微信上传自己的注册GCM ID给微信Server。
    * 微信Server在发现长连接失效的情况下,可以使用GCM 作为辅助通道通知客户端有新消息,客户端收到push通知后做一次sync。
    * 只利用GCM来激活微信,不传递消息的具体数据,要控制给同一设备发送GCM通知的时间间隔(如五分钟)。
  3. 自适应心跳间隔优化
    1. 影响TCP连接寿命的因素
      在Android下,不管是GCM,还是微信,都是通过TCP长连接来进行Push消息的,TCP长连接存活,消息Push就及时,所以要对影响TCP连接寿命的因素进行研究。
      • NAT超时
        大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰 NAT 表中的对应项,造成链路中断(NAT超时的更多描述见附录6.1)。NAT超时是影响TCP连接寿命的一个重要因素(尤其是国内),所以客户端自动测算NAT超时时间,来动态调整心跳间隔,是一个重要的优化点。
      • DHCP的租期(lease time)
        目前测试发现安卓系统对DHCP的处理有Bug,DHCP租期到了不会主动续约并且会继续使用过期IP,这个问题会造成TCP长连接偶然的断连。(租期问题的具体描述见附录6.2)。
      • 网络状态变化
        手机网络和WIFI网络切换、网络断开和连上等情况有网络状态的变化,也会使长连接变为无效连接,需要监听响应的网络状态变化事件,重新建立Push长连接。
    2. 心跳范围选择
      • 前后台区分处理:
        为了保证微信收消息及时性的体验,当微信处于前台活跃状态时,使用固定心跳。
        微信进入后台(或者前台关屏)时,先用几次最小心跳维持长链接。然后进入后台自适应心跳计算。这样做的目的是尽量选择用户不活跃的时间段,来减少心跳计算可能产生的消息不及时收取影响。
      • 后台自适应心跳选择区间:
        可根据自身产品的特点选择合适的心跳范围。
    3. 状态转换图


    4. 自适应心跳算法描述
      • 按网络类型区分计算:
        因为每个网络的NAT时间可能不一致。所以需要区分计算,数据网络按subType做关键字,WIFI按WIFI名做关键字。
        对稳定的网络,因为NAT老化时间的存在,在自适应计算态的时候,暂设计以下步骤在当前心跳区间逼近出最大可用的心跳。
      • 变量说明:
        [MinHeart,MaxHeart]——心跳可选区间。
        successHeart——当前成功心跳,初始为MinHeart
        curHeart——当前心跳初始值为successHeart
        heartStep——心跳增加步长
        successStep——稳定期后的探测步长
      • 最大值探测步骤:



        图4-1 自适应心跳计算流程
        自适应心跳计算流程如图4-1所示,经过该流程,会找到必然使心跳失败的curHeart(或者MaxHeart),为了保险起见,我们选择比前一个成功值稍微小一点的值作为后台稳定期的心跳间隔。
        影响手机网络测试的因素太多,为了尽量保证测试结果的可靠性,我们使用延迟心跳测试法。在我们重新建立TCP连接后,先使用 短心跳连续成功三次,我们才认为网络相对稳定,可以使用curHeart进行一次心跳测试。图4-2显示了一次有效心跳测试过程。图4-3显示了在没有达到稳定网络环境时,我们会一直使用固定短心跳直到满足三次连续短心跳成功。
        使用延迟心跳测试的好处是,可以剔除偶然失败,和网络变化较大的情况(如地铁),使测试结果相对可靠(五次延迟测试确定结论)。同时在网络波动较大的情况,使用短心跳,保证收取消息相对及时。

      • 运行时的动态调整策略(已经按测算心跳稳定值后)
        NAT超时值算出来后,在维持心跳的过程中的策略
      • 无网络、网络时好时坏、偶然失败、NAT超时变小:在后台稳定期发生心跳发生失败后,我们使用延迟心跳测试法测试五次。如果有一次成功,则保持当前心跳值不变;如果五次测试全失败,重新计算合理心跳值。该过程如图4-4所示,有一点需要注意,每个新建的长连接需要先用短心跳成功维持3次后才用successHeart进行心跳。



        图4-2 后台稳定态动态调整心跳策略

      • NAT超时变大:以周为周期,每周三将后台稳定态调至自适应计算态,使用心跳延迟法往后探测心跳间隔。
      • successHeart是NAT超时临界值:因为我们现在选择的是一个比successHeart稍小的值作为稳定值,所以在计算过程中可以避开临界值。当运营商在我们后台稳定期将NAT超时调整为我们当前计算值,那么由于我们每周会去向下探索,所以下一周探测时也可以及时调整正确。
    5. 冗余Sync和心跳
      在用户的一些主动操作以及联网状态改变时,增加冗余Sync和心跳,确保及时收到消息。
      • 当用户点亮屏幕的时候,做一次心跳。
      • 当微信切换到前台时,做一次Sync。
      • 联网时重建信令TCP,做一次Sync
可能存在的风险及预防措施
  1. DHCP租期因素
  1. 其他影响TCP寿命的因素
附录

1. 附录A——NAT超时介绍

地区/网络 NAT超时时间
中国移动3G和2G 5分钟
中国联通2G 5分钟
中国电信3G 大于28分钟
美国3G 大于28分钟
台湾3G 大于28分钟

长连接心跳间隔必须要小于NAT超时时间(aging-time),如果超过aging-time不做心跳,TCP长连接链路就会中断,Server就无法发送Push给手机,只能等到客户端下次心跳失败后,重建连接才能取到消息。

2. 附录B——安卓DHCP的租期(lease time)问题
目前测试发现安卓系统对DHCP的处理有Bug:

上一篇 下一篇

猜你喜欢

热点阅读