本文章介绍了Android中第三方目前是免费的推送软件:极光推送、个推,我认为这两个服务平台功能实质在应用开发者看来基本相似,只是我们在开发是步骤稍微略有不同之处。
1、极光推送
点击SDK下载,下载完后解压,按照文档一步步来即可。
原理:
移动互联网应用现状 因为手机平台本身、电量、网络流量的限制移动互联网应用在设计上跟传统 PC 上的应用很大不一样需要根据手机本身的特点尽量的节省电量和流量同时又要尽可能的保证数据能及时到达客户端。 为了解决数据同步的问题在手机平台上常用的方法有2种。一种是定时去服务器上查询数据也叫Polling还有一种手机跟服务器之间维护一个 TCP 长连接当服务器有数据时实时推送到客户端也就是我们说的 Push。 从耗费的电量、流量和数据送达的及时性来说Push 都会有明显的优势但 Push 的实现和维护成本相对较高。在移动无线网络下维护长连接相对也有一些技术上的难度。本文试图给大家介绍一下我们极光推送在 Android 平台上是如何维护长连接。 移动无线网络的特点 因为 IP v4 的 IP 量有限运营商分配给手机终端的 IP 是运营商内网的 IP手机要连接 Internet就需要通过运营商的网关做一个网络地址转换Network Address TranslationNAT。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系以确保内网的手机可以跟 Internet 的服务器通讯。 图片源自 cisco.com. NAT 功能由图中的 GGSN 模块实现。 大部分移动无线网络运营商都在链路一段时间没有数据通讯时会淘汰 NAT 表中的对应项造成链路中断。 Android 平台上长连接的实现 为了不让 NAT 表失效我们需要定时的发心跳以刷新 NAT 表项避免被淘汰。 Android 上定时运行任务常用的方法有2种一种方法用 Timer另一种是AlarmManager。 Timer Android 的 Timer 类可以用来计划需要循环执行的任务Timer 的问题是它需要用 WakeLock 让 CPU 保持唤醒状态这样会大量消耗手机电量大大减短手机待机时间。这种方式不能满足我们的需求。 AlarmManager AlarmManager 是 Android 系统封装的用于管理 RTC 的模块RTC (Real Time Clock) 是一个独立的硬件时钟可以在 CPU 休眠时正常运行在预设的时间到达时通过中断唤醒 CPU。 这意味着如果我们用 AlarmManager 来定时执行任务CPU 可以正常的休眠只有在需要运行任务时醒来一段很短的时间。极光推送的 Android SDK 就是基于这种技术实现的。 服务器设计 当有大量的手机终端需要与服务器维持长连接时对服务器的设计会是一个很大的挑战。 假设一台服务器维护10万个长连接当有1000万用户量时需要有多达100台的服务器来维护这些用户的长连接这里还不算用于做备份的服务器这将会是一个巨大的成本问题。那就需要我们尽可能提高单台服务器接入用户的量也就是业界已经讨论很久了的 C10K 问题。 C2000K 针对这个问题我们专门成立了一个项目命名为C2000K顾名思义我们的目标是单机维持200万个长连接。最终我们采用了多消息循环、异步非阻塞的模型在一台双核、24G内存的服务器上实现峰值维持超过300万个长连接。 后记 稳定维护长连接是推送平台的一个基础极光推送团队将会在这方面长期投入以保证用户能有效的节省电量、流量同时数据能实时送达。
2、个推
点击SDK下载,下载完后解压,按照文档一步步来即可。
原理:
PUSH是互联网上内容提供者和内容定制方之间的一种通信机制,利用在服务器端的程序把数据源源不断地推向客户端,大大提高客户机和服务器之间的交互性能。
传统互联网上数据交互一般有poll和push两种方式。poll典型使用场景是浏览网页,是用户主动发起请求,向服务器获取数据;push刚好相反,通过服务器直接发送数据给客户端,用户被动接受消息,类似于更加及时的短信。Push的使用场景有以下两特点:时间不确定性、时效性,如发送团购信息,发送电子消费账单等。
个推为第三方应用提供了跨手机平台一致的、稳定可靠的消息推送服务,实现服务端到客户端的消息主动推送。第三方应用可以实现针对单一目标地址的推送,也可以实现群发消息推送,还可以通过指定tag进行定向群组推送。个推除了为第三方提供基本的透明消息传输,还提供了一些消息展示方式,实现在客户端的通知提示、弹框操作等,帮助客户快速实现更为定制化的消息推送服务。
个推目前支持Android、iOS手机平台。
首先我们来看一下组成一个推送系统的几个要素
1. 个推SDK:
以jar的方式出现,集成于第三方客户端,解析第三方下行的数据,并把结果透传给第三方客户端;也可以上行第三方定制的客户端信息。
2. 个推服务器:
一侧负责维护与成千上万的个推SDK的长时连接,另一侧与第三方服务器对接,将第三方定制数据下行推送至个推SDK。
3. 第三方服务器:
数据推送的发起者,通过对接个推服务器,将数据发送至第三方客户端。
4. 第三方客户端:
第三方集成个推SDK的客户端,推送数据正真的接收者和展现者。
以上是个推推送系统中的四个不同角色,看起来比较抽象,可以通过以下图片来加强理解:
说明:
AppID:应用ID,第三方在个推系统注册帐号并创建生成的唯一的应用标识。
ClientID:用于标识客户端身份,由第三方客户端获取并保存到第三方服务端。
UID:一般为第三方系统帐号体系中的用户标识。第三方服务端一般需要保存UID和ClientID的映射关系,进行消息推送时,通过UID查找到相应的ClientID,便可进行定向推送了。
我们用一个更加形象的方式来描述一下这个系统:淘宝购物相信很多人都体验过,就拿它举个例子。
淘宝卖家——第三方服务器
淘宝买家——第三方客户端
快递公司(比如顺风)——个推服务器
集淘宝买家中的地址管理、快递查收、包裹检验等一系列工作的集合——个推SDK(这个有点不形象,但是大概理解意思就好)。
假设淘宝买家下了一单,首先需要填写寄件地址(假设不用默认的),这个相当于个推SDK根据客户端的信息,建立了一条通道(快递配送地址)。
当买家付款成功后,卖家需要发货(第三方服务端要推送数据),当然先叫快递公司拿件(把推送数据发送给个推服务器),快递公司根据包裹上的地址(第三方客户端的身份信息,就是上面所说的ClientID)将包裹(数据)寄送到买家(第三方客户端),买家收货后,先验收一下货物是否有损坏(数据是否符合定制要求),获取到包裹内容(获得服务端推送的数据),并签单验收(个推SDK反馈数据发送成功)。
与上面的例子相对应,我们再描述一遍整个推送过程的技术流程:
1. 第三方客户端集成个推SDK。
2. 第三方客户端启动的时候,调用SDK接口,启动推送服务,SDK后台运行并维护和个推服务端的长连接,实现SDK注册和登录。
3. 第三方服务端调用个推服务器的接口,将要发送的数据通过个推服务器发送到指定身份的个推SDK当中。
4. 个推SDK解析定制数据,并且把第三方服务器透传的数据发送给第三方客户端,第三方客户端根据服务器的数据做出相应的动作或者展现。
初步看来,实现一个推送系统并不是特别复杂,然后实际上,尤其是针对Android移动终端来说,仍然有相当多的技术问题需要克服。
1. 电源管理
Android系统为了最大程度降低手机功耗、延长待机时间,在电源管理方面做了非常大量的底层工作,对电池的使用到了精打细算的地步。然而Android系统在电源管理方面做出的这些努力,很轻易地就能被不守规矩的应用程序消耗殆尽。个推SDK服务作为需要长期后台稳定运行的程序,在电源管理方面能够做到取之有度,日均耗电量能够控制在40mAh左右,对用户日常手机使用几乎没有影响。
2. 网络稳定性
在国内移动运营商网络条件下,地区差异、时间段差异、运营商差异都比较明显,使得手机上实现稳定的联网困难重重。为了在各种网络条件下,都能实现稳定联网和流量消耗的兼顾平衡,个推研发了能够根据网络状况动态调整心跳间隔的自适应算法,以最小的网络代价实现最稳定的联网质量。目前个推SDK空载流量消耗每月仅有0.8M-1.2M,不会对用户的钱袋造成损失。
3. 性能问题
为了实现千万SDK同时连接到服务端,同时又能控制系统运营成本,推送平台需要具备平行可扩展能力,以及较高的接入服务器性能。目前个推系统通过内核调优、代码优化、层级架构设计等技术手段,已经实现单击200w稳定在线,理论上支持无限平行扩展,并且经得起实践考验,正在在线上为超过千万的用户提供稳定的推送服务。
推送服务是伴随着移动互联网的发展,逐渐显露出来的商业化诉求。越来越多的移动应用、电商、游戏意识到推送服务对于自身业务的重要性,然后国内的现状,导致Android系统上并没有稳定可靠的推送服务可供使用,于是个推应运而生。本文概要介绍了个推系统的结构和消息推送流程,并对实践中必须解决的技术问题做了探讨。个推致力于实现Android系统上最稳定可靠的推送服务,并在相关技术参数上做到了极致。