微信号:yunbaio13

介绍:云巴官方订阅号,定期发布业内技术干货、有关实时技术的案例教程以及云巴产品动态等内容.

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

2016-11-03 17:59 云巴

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


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


从耗费的电量、流量和数据送达的及时性来说,Push 都会有明显的优势,但 Push 的实现和维护成本相对较高。在移动无线网络下维护长连接,相对也有一些技术上的难度。

移动无线网络的特点

因为 IP v4 的 IP address 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网 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 可以正常的休眠,只有在需要运行任务时醒来一段很短的时间。

服务器设计

当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。


假设一台服务器维护10万个长连接,当有1000万用户量时,需要有多达100台的服务器来维护这些用户的长连接,这里还不算用于做备份的服务器,这将会是一个巨大的成本问题。那就需要我们尽可能提高单台服务器接入用户的量,也就是业界已经讨论很久了的 C10K 问题。


作者简介

张虎(Tiger

weibo: @Tiger_张虎, 云巴 (yunba.io) 创始人,yunba.io 云端实时消息服务。 JPush 创始人,原CTO。 Oracle VM 创始团队成员。

 
云巴 更多文章 云巴实时案例|使用云巴智能插座,用户可远程查看、控制插座上各开关的状态 云巴实时案例|云巴多屏触摸,实时记录并展示手指或鼠标位置 手把手教你写一个 Javascript 框架:项目结构 物联网世界的前端开发 RESTful 究竟是什么?
猜您喜欢 CogniToys:一个神奇的玩具 关于人工智能,那些不可忽略的灰色区域 | 专栏 【第2章第189回】一探前端开发中的JS调试技巧 梁启超写给青年人的信:如何成为一个不惑、不忧、不惧的人? python中单引号,双引号,多引号区别