`

推送底层原理

 
阅读更多

  使用push链接:http://jingyan.baidu.com/article/4f34706ecf2664e387b56d98.html

                            http://www.devstore.cn/new/newInfo/948.html

 

**移动互联网应用现状**
因为手机平台本身、电量、网络流量的限制,移动互联网应用在设计上跟传统 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万个长连接。
**后记**
稳定维护长连接是推送平台的一个基础,极光推送团队将会在这方面长期投入,以保证用户能有效的节省电量、流量,同时数据能实时送达。

119935.jpg
分享到:
评论

相关推荐

    混合移动应用的消息推送之websocket

    混合应用一般使用Cordova...对于混合应用的websocket消息推送,其基本原理如下:图1.Hybridappwebsocket工作流程而原生应用的消息推送,其基本原理如下图:图2.原生app消息推送工作流程目前后者主要应用于原生app,而前

    基于datax实现data以rpc的方式传递json配置调用推数服务.zip

    具体如何使用,如何做插件开发以及datax底层原理,请关注https://blog.csdn.net/xiaoyao1999hn ##打包方式 $ mvn -U clean package assembly:assembly -Dmaven.test.skip=true #如何启动服务 运行datax-servicer...

    尚硅谷Java视频教程_Docker核心技术

    CentOS6安装Docker.avi 08_尚硅谷_Docker_CentOS7安装Docker简介(补充知识请看34集).avi 09_尚硅谷_Docker_阿里云镜像加速器配置.avi 10_尚硅谷_Docker_helloworld镜像.avi 11_尚硅谷_Docker_运行底层原理.avi 12_...

    尚硅谷Docker核心技术视频教程

    11_尚硅谷_Docker_运行底层原理.avi 12_尚硅谷_Docker_帮助命令.avi 13_尚硅谷_Docker_镜像命令.avi 14_尚硅谷_Docker_容器命令(上).avi 15_尚硅谷_Docker_容器命令(下).avi 16_尚硅谷_Docker_镜像原理.avi 17_...

    详解本地库的使用以及原理(二)

    我们在上一个当中了解到,如何创建一个本地库,然后...这里就是保存你需要往git推送的内容.Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master

    云计算第二版

    3.7 内容推送服务CloudFront 115 3.7.1 内容推送网络CDN 115 3.7.2 云内容推送CloudFront 117 3.8 其他Amazon云计算服务 119 3.8.1 快速应用部署Elastic Beanstalk和服务模板CloudFormation 119 3.8.2 云中的DNS服务...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    除此之外,用户需要亲临检测机构实地送检,在检测的每一个环节用户也无法有效的进行追踪,这些都制约着认证检测领域的进一步发展。鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别...

    GIT中文资源

    2.5.4 推送数据到远程仓库 . . . . . . . . . . . . . . . . . . . . . 33 2.5.5 查看远程仓库信息 . . . . . . . . . . . . . . . . . . . . . . 34 2.5.6 远程仓库的删除和重命名 . . . . . . . . . . . . . . . ....

    Altium Designer Beta 19.0.10完整版安装包+安装教程+和谐文件

    添加了交互式路由逻辑,以防止子通道在推送和拥抱过程中与其堆叠的通路设置轴分离。 27708 修复了在特定项目中打开PCB文档后未出现反钻的问题。 27771 在Interactive Routing Properties面板中添加了完全标记的Via侧...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

Global site tag (gtag.js) - Google Analytics