Android开发之——移动无线网络长连接

移动互联网应用现状

因为手机平台本身、电量、网络流量的限制,移动互联网应用在设计上跟传统PC上的应用很大不一样,需要根据手机本身的特点,尽量的节省电量和流量,同时又要尽可能的保证数据能及时达到客户端。

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

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

移动无线网络的特点

因为IPv4的IP量有限,运营商分配给手机终端的IP是运营商内网的IP,手机要连接Internet,就需要通过运营商的网关做一个网络地址转化(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网IP、端口到内网IP、端口的对应关系,以确保内网的手机可以跟Internet的服务器通讯。

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台的服务器来维护这些用户的长连接,这里还不算用于做备份的服务器,这将会一个巨大的成本问题。那就需要我们尽可能提高单台服务器接入用户的量,也就是业界讨论很久的C10问题。

C2000K

针对这个问题,我们专门成立了一个项目,命名为C2000K,顾名思义,我们的目标是单机维持200万个长连接。最终我们采用了多消息循环、异步非租塞的模型,在一台双核、24G内存的服务器上,实现峰值维持超过300万个长连接。

参考:

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