【文章分享】移动无线网络长连接

freerocker 2013-01-22 10:48:05
移动互联网应用现状

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

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

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

移动无线网络的特点

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

C2000K

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


后记


稳定维护长连接是推送平台的一个基础,极光推送团队将会在这方面长期投入,以保证用户能有效的节省电量、流量,同时数据能实时送达。
...全文
1158 53 点赞 打赏 收藏 举报
写回复
53 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
siesta 2014-10-08
双核300w连接,估计是基本没啥io的情况,纯扛连接多进程没啥问题,基本的epoll就能搞定。无线的长连接关键问题是心跳,影响耗电,还有各种奇葩机型,水深的地方不在扛连接啥的
  • 打赏
  • 举报
回复
leaf8742 2014-05-20
多进程,多线程,netty?
  • 打赏
  • 举报
回复
bigsonn 2014-02-18
因为手机平台本身、电量、网络流量的限制
  • 打赏
  • 举报
回复
xinzhnn 2014-01-17
从耗费的电量、流量和数据送达的及时性来说,Push 都会有明显的优势
  • 打赏
  • 举报
回复
blaack 2014-01-14
大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰 NAT 表中的对应项,造成链路中断。
  • 打赏
  • 举报
回复
beacal 2014-01-02
当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。
  • 打赏
  • 举报
回复
wekena 2013-12-27
手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换
  • 打赏
  • 举报
回复
BBjrus 2013-12-20
从耗费的电量、流量和数据送达的及时性来说,Push 都会有明显的优势,但 Push 的实现和维护成本相对较高。
  • 打赏
  • 举报
回复
superrunn 2013-12-13
因为 IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换
  • 打赏
  • 举报
回复
bingba 2013-12-03
在移动无线网络下维护长连接,相对也有一些技术上的难度。
  • 打赏
  • 举报
回复
butico 2013-11-22
苹果有专门的服务器做推送
  • 打赏
  • 举报
回复
butico 2013-11-22
为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰。
  • 打赏
  • 举报
回复
turnnoo 2013-11-15
运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机可以跟 Internet 的服务器通讯。
  • 打赏
  • 举报
回复
laryb 2013-11-12
说得在理
  • 打赏
  • 举报
回复
sunsengood 2013-11-05
当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。
  • 打赏
  • 举报
回复
blicoach 2013-10-31
当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。
  • 打赏
  • 举报
回复
u012532146 2013-10-25
AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。
  • 打赏
  • 举报
回复
tornaa 2013-10-22
从耗费的电量、流量和数据送达的及时性来说,Push 都会有明显的优势,但 Push 的实现和维护成本相对较高。在移动无线网络下维护长连接,相对也有一些技术上的难度。
  • 打赏
  • 举报
回复
brucelllll 2013-10-16
大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰 NAT 表中的对应项,造成链路中断。
  • 打赏
  • 举报
回复
TMbouch 2013-10-14
为了不让 NAT 表失效,我们需要定时的发心跳,以刷新 NAT 表项,避免被淘汰。
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
Android
加入

7.9w+

社区成员

移动平台 Android
申请成为版主
帖子事件
创建了帖子
2013-01-22 10:48
社区公告
暂无公告