极光推送技术原理:移动无线网络长链接

移动互联网应用现状

由于手机平台自己、电量、网络流量的限制,移动互联网应用在设计上跟传统 PC 上的应用很大不同,须要根据手机自己的特色,尽可能的节省电量和流量,同时又要尽量的保证数据能及时到达客户端。 服务器

为了解决数据同步的问题,在手机平台上,经常使用的方法有2种。一种是定时去服务器上查询数据,也叫Polling,还有一种手机跟服务器之间维护一个 TCP 长链接,当服务器有数据时,实时推送到客户端,也就是咱们说的 Push。 网络

从耗费的电量、流量和数据送达的及时性来讲,Push 都会有明显的优点,但 Push 的实现和维护成本相对较高。在移动无线网络下维护长链接,相对也有一些技术上的难度。本文试图给你们介绍一下咱们极光推送在 Android 平台上是如何维护长链接。 异步

移动无线网络的特色

由于 IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要链接 Internet,就须要经过运营商的网关作一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关须要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机能够跟 Internet 的服务器通信。 spa

http://www.cisco.com/en/US/i/100001-200000/110001-120000/119001-120000/119935.jpg

图片源自 cisco.com.  设计

NAT 功能由图中的 GGSN 模块实现。 图片

大部分移动无线网络运营商都在链路一段时间没有数据通信时,会淘汰 NAT 表中的对应项,形成链路中断。 内存

Android 平台上长链接的实现

为了避免让 NAT 表失效,咱们须要定时的发心跳,以刷新 NAT 表项,避免被淘汰。 ci

Android 上定时运行任务经常使用的方法有2种,一种方法用 Timer,另外一种是AlarmManager。 get

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万个长链接。

相关文章
相关标签/搜索