概述算法
PUSH是互联网上内容提供者和内容定制方之间的一种通讯机制,利用在服务器端的程序把数据源源不断地推向客户端,大大提升客户机和服务器之间的交互性能。服务器
传统互联网上数据交互通常有pull和push两种方式。pull典型使用场景是浏览网页,是用户主动发起请求,向服务器获取数据;push恰好相反,经过服务器直接发送数据给客户端,用户被动接受消息,相似于更加及时的短信。Push的使用场景有如下两特色:时间不肯定性、时效性,如发送团购信息,发送电子消费帐单等。网络
个推为第三方应用提供了跨手机平台一致的、稳定可靠的消息推送服务,实现服务端到客户端的消息主动推送。第三方应用能够实现针对单一目标地址的推送,也能够实现群发消息推送,还能够经过指定tag进行定向群组推送。个推除了为第三方提供基本的透明消息传输,还提供了一些消息展现方式,实如今客户端的通知提示、弹框操做等,帮助客户快速实现更为定制化的消息推送服务。
个推目前支持Android、iOS手机平台。架构
技术原理性能
首先咱们来看一下组成一个推送系统的几个要素
1. 个推SDK:
以jar的方式出现,集成于第三方客户端,解析第三方下行的数据,并把结果透传给第三方客户端;也能够上行第三方定制的客户端信息。
2. 个推服务器:
一侧负责维护与成千上万的个推SDK的长时链接,另外一侧与第三方服务器对接,将第三方定制数据下行推送至个推SDK。
3. 第三方服务器:
数据推送的发起者,经过对接个推服务器,将数据发送至第三方客户端。
4. 第三方客户端:
第三方集成个推SDK的客户端,推送数据正真的接收者和展示者。优化
以上是个推推送系统中的四个不一样角色,看起来比较抽象,能够经过如下图片来增强理解:spa
说明:架构设计
AppID:应用ID,第三方在个推系统注册账号并建立生成的惟一的应用标识。
ClientID:用于标识客户端身份,由第三方客户端获取并保存到第三方服务端。
UID:通常为第三方系统账号体系中的用户标识。第三方服务端通常须要保存UID和ClientID的映射关系,进行消息推送时,经过UID查找到相应的ClientID,即可进行定向推送了。设计
咱们用一个更加形象的方式来描述一下这个系统:淘宝购物相信不少人都体验过,就拿它举个例子。接口
淘宝卖家——第三方服务器
淘宝买家——第三方客户端
快递公司(好比顺风)——个推服务器
集淘宝买家中的地址管理、快递查收、包裹检验等一系列工做的集合——个推SDK(这个有点不形象,可是大概理解意思就好)。
假设淘宝买家下了一单,首先须要填写寄件地址(假设不用默认的),这个至关于个推SDK根据客户端的信息,创建了一条通道(快递配送地址)。
当买家付款成功后,卖家须要发货(第三方服务端要推送数据),固然先叫快递公司拿件(把推送数据发送给个推服务器),快递公司根据包裹上的地址(第三方客户端的身份信息,就是上面所说的ClientID)将包裹(数据)寄送到买家(第三方客户端),买家收货后,先验收一下货物是否有损坏(数据是否符合定制要求),获取到包裹内容(得到服务端推送的数据),并签单验收(个推SDK反馈数据发送成功)。
与上面的例子相对应,咱们再描述一遍整个推送过程的技术流程:
1. 第三方客户端集成个推SDK。
2. 第三方客户端启动的时候,调用SDK接口,启动推送服务,SDK后台运行并维护和个推服务端的长链接,实现SDK注册和登陆。
3. 第三方服务端调用个推服务器的接口,将要发送的数据经过个推服务器发送到指定身份的个推SDK当中。
4. 个推SDK解析定制数据,而且把第三方服务器透传的数据发送给第三方客户端,第三方客户端根据服务器的数据作出相应的动做或者展示。
陷阱
初步看来,实现一个推送系统并非特别复杂,而后实际上,尤为是针对Android移动终端来讲,仍然有至关多的技术问题须要克服。
· 电源管理
Android系统为了最大程度下降手机功耗、延长待机时间,在电源管理方面作了很是大量的底层工做,对电池的使用到了精打细算的地步。然而Android系统在电源管理方面作出的这些努力,很轻易地就能被不守规矩的应用程序消耗殆尽。个推SDK服务做为须要长期后台稳定运行的程序,在电源管理方面可以作到取之有度,日均耗电量可以控制在40mAh左右,对用户平常手机使用几乎没有影响。
· 网络稳定性
在国内移动运营商网络条件下,地区差别、时间段差别、运营商差别都比较明显,使得手机上实现稳定的联网困难重重。为了在各类网络条件下,都能实现稳定联网和流量消耗的兼顾平衡,个推研发了可以根据网络情况动态调整心跳间隔的自适应算法,以最小的网络代价实现最稳定的联网质量。目前个推SDK空载流量消耗每个月仅有0.8M-1.2M,不会对用户的钱袋形成损失。
· 性能问题
为了实现千万SDK同时链接到服务端,同时又能控制系统运营成本,推送平台须要具有平行可扩展能力,以及较高的接入服务器性能。目前个推系统经过内核调优、代码优化、层级架构设计等技术手段,已经实现单击200w稳定在线,理论上支持无限平行扩展,而且经得起实践考验,正在在线上为超过千万的用户提供稳定的推送服务。
总结
本文简要介绍了个推系统的结构和消息推送流程,并对实践中必须解决的技术问题作了探讨。个推致力于实现Android系统上最稳定可靠的推送服务,并在相关技术参数上作到了极致。