硬核干货!移动推送智能心跳探测技术“大揭秘”

早上安全君拿起手机就看到一条条推送信息:疫情实时数据、你的包裹正在派送中、今日天气无雨…… 

消息推送已经成为争夺用户关注的必备工具,而评价推送系统有一个关键的指标:日活到达率(当日活跃过的用户能够接受到推送的比例)。用户在点击推送消息后,客户端和服务端会通过长连接来建立消息通道,而长连接的保持率至关重要。

如何能做到长连接保持率的同时,还省电省流量呢?今天就为大家揭开百度慧推消息推送服务智能心跳技术的神秘面纱。

百度慧推平台有效解决了上述难题,依托长连接技术,依靠智能心跳实现后台进程的常驻,进而实现从云端到设备的一体化推送服务,以达到实时、精准、多元化的消息推送。

在介绍智能心跳技术之前,我们需要先了解以下三个问题:

1、 为什么要使用心跳技术?

网络运营商在链路一段时间没有数据通讯时,会淘汰NAT表中的对应项,造成链路中断(如图1所示), 其它因素如网络切换、弱网等情况也会造成链路中断。

图1. 运营商 NAT超时时间

2、 制定心跳技术需关注哪些问题点?

长时间保持链路的畅通、心跳间隔要尽可能大、心跳包要尽可能小,以减少设备的电量和流量消耗。

3、可能存在的风险和预防措施?

Android6.0以后,手机将支持低功耗模式,在IDLE模式下,网络中断,线程心跳将无法保持链路的畅通。

所以心跳技术运用得当,一方面可以有效的提升长连接的稳定性,另一方面也可以降低设备在维持长连接过程中所耗费的电量,基于此我们提出了一种智能心跳的技术(如图2所示)。

图2. 百度慧推智能心跳展示图

首先,我们会预先在云端动态下发几个值,规定智能心跳的限定边界。

  • [MIN,MAX]:心跳的最小、最大值
  • [CurHeart]:当前心跳值  
  • [StableHeart]:稳定心跳值  
  • [HeartStep]:心跳步长
  • [default]:默认心跳值
  • [default_alarm]:默认辅助心跳
其次,我们在客户端预制三个状态值(如图2),负责智能心跳流程的控制。
  • ACTIVE(活跃态):初始化状态 使用最小心跳成功探测X次,进入EXPLORE
  •  EXPLORE (探测态):探测心跳最大步长状态 心跳值按步长累加增长,在此状态如心跳探测失败,则认为上一次为稳定心跳值,进入STEDY,心跳区间[min,max] 收到新消息,进入ACTIVE STEADY (稳定态) :已探测出心跳的稳定值,将用此稳定值做心跳 更新稳定心跳,告知云端稳定心跳值,云端进行记录 连续心跳失败俩次,则进入ACTIVE,重新探测心跳间隔
  • 另外,百度慧推还有辅助心跳技术。
  • Android低功耗模式(Doze Mode):从 Android 6.0(API 级别 23)开始,Android 引入了低电耗模式,通过在设备长时间处于闲置状态时推迟应用的后台 CPU 和网络等来减少电池消耗,为用户延长电池寿命。
  图3. Doze Mode 介绍 并且,不同厂商对Doze Mode的修改是不一样的(如图4所示)。 图4. 不同厂商对 Doze Mode 的修改 针对采样分析,各个厂商的不同ROM版本在IDLE模式下的Alarm唤醒间隔不一样,所以我们实现一种基于Alarm的辅助心跳,云端依据大数据智能配置心跳,依据不同的厂商的设备进行控制,提升心跳机制的成功率。   以上为百度慧推消息推送服务智能心跳技术解读。