cpu多核利用能够实现Android推送的吞吐量。

  讲明白这点,我们需要了解Android推送的基本原理了。如果实现C(客户端)与server(客户端)实时通讯了。这里有两种思路了:

  1.一种是定时去server查询数据,通常是使用HTTP协议来访问web服务器,称Polling(轮询);

  2.还有一种是移动端和服务器建立长连接,使用XMPP长连接,称Push(推送)。(按照本人理解:客户端的实现时:
  while(true) {
   request(timeout);
   request(timeout);
  }
  客户端发出一个“长”请求,如果服务器发送消息或者时间out了,客户端就断开这个请求,再建立一个长请求从耗费的电量、流量和数据延迟性各方面来说,Push有明显的优势。但是使用Push的缺点是:对于客户端:实现和维护相对成本高,在移动无线网络下维护长连接,相对有一些技术上的开发难度。对于服务器:如何实现多核并发,cpu作业调度,数量庞大的长连接并发维护等技术,仍存在开发难点。在讲述Push方案的原理前,我们先了解一下移动无线网络的特点。

移动无线网络的特点:

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

  GGSN(Gateway GPRS Support Node 网关GPRS支持结点)模块就实现了NAT功能。因为大部分移动无线网络运营商都是为了减少网关的NAT映射表的负荷,所以如果发现链路中有一段时间没有数据通讯时,会删除其对应表,造成链路中断。

  Push在Android平台上长连接的实现:
  既然我们知道我们移动端要和Internet进行通信,必须通过运营商的网关,所以,为了不让NAT映射表失效,我们需要定时向Internet发送数据,因为只是为了不然NAT映射表失效,所以只需发送长度为0的数据即可。注意这种定时发送的时间又叫心跳时间。  分析:

  Timer:可以按照计划或者时间周期来执行相关的任务。但是Timer需要用WakeLock来让CPU保持唤醒状态,才能保证任务的执行,这样子会消耗大量流量;当CPU处于休眠的时候,就不能唤醒执行任务,所以应用于移动端明显是不合适。

  AlarmManager:AlarmManager类是属于android系统封装好来管理RTC模块的管理类。这里就涉及到RTC模块,要更好地了解两者的区别,就要明白两者真正的区别。
RTC(Real- Time Clock)实时闹钟在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32.768KHz 晶体和电阻电容等。(如果对这方面感兴趣,可以自己查阅相关资料,这里就说个大概)
好了,回来正题。所以,AlarmManager又称全局定时闹钟。这意味着,当我用使用AlarmManager来定时执行任务,CPU可以正常地休眠,只有在执行任务是,才唤醒CPU,这个过程是很短时间的。
  下面简单来说明其使用
  1.类似于Timer功能:
  //获得闹钟管理器
  AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
  //设置任务执行计划
  am.setRepeating(AlarmManager.ELAPSED_REALTIME, firstTime, 5*1000, sender);//从firstTime才开始执行,每隔5秒再执行

  2.实现全局定时功能:
  //获得闹钟管理器
  AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
  //设置任务执行计划
  am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 5*1000, sender);//从firstTime才开始执行,每隔5秒再执行

  总结:在android客户端使用Push推送时,应该使用AlarmManager来实现心跳功能,使其真正实现长连接。
  

  在服务器端的实现:
  在服务器端,可以使用很多语言来实现,如C/C++,java,Erlang等等,如我们国内比较好的极光推送(C开发),openfire(java开发)等等。
  最近我看了极光推送的介绍和原理,下面我就说说他们是遇到什么难题,然后使用什么技术或者方案来解决呢。

  当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。
  假设一台服务器维护10万个长连接,当有1000万用户量时,需要有多达100台的服务器来维护这些用户的长连接,这里还不算用于做备份的服务器,这将会是一个巨大的成本问题。那就需要我们尽可能提高单台服务器接入用户的量,也就是业界已经讨论很久了的 C10K 问题。
      这是他们怎么做的了,他们是非常巧妙的利用cpu中多核的原理,利用多核来唤起了相应核数个线程了,并且利用非阻塞的消息队列的机制,大大提高了服务器的吞吐量了,这样能够是一个服务器维持200个左右的长连接了,这样有效突破了业界一个瓶颈了。可见多核实现了android消息推送重要性。相应的思维导图如下:

  这就是对android推送的分析。

转载于:https://www.cnblogs.com/manuosex/p/3660727.html

Android推送分析相关推荐

  1. Android推送服务的几种实现方式

    现实生活中, 推送服务就像订杂志一样, 只要留下你的地址, 杂志就能如期送到你手里, 可以认为每个人都有唯一的一个地址, 但在目前的网络上, 这是办不到的, 因为不是每个人都有一个唯一的地址, 服务器 ...

  2. android极光静默推送,Android 推送 整合小米、个推、jpush

    Android系统由google提供的推送的服务在国内并不能很好的运作,因此不能像iOS能提供统一管理的推送服务.Android端推送目前常用的都是第三方推送服务,也可以自己搭建推送服务器来实现, 为 ...

  3. Android 推送 整合小米、个推、jpush

    Android系统由google提供的推送的服务在国内并不能很好的运作,因此不能像iOS能提供统一管理的推送服务.Android端推送目前常用的都是第三方推送服务,也可以自己搭建推送服务器来实现, 为 ...

  4. 个推无法获取个推id_最新个推Android 推送 SDK Maven 集成

    概述 公司准备采用个推作为第三方推送平台,我作为客户端的头号小鸟,掐指一算已经毕业 0.1 年了,Leader 准备把这个简单而又独立的功能点交给我来处理,我紧张兮兮的打开官网集成文档 学习了起来.其 ...

  5. Android推送通知指南(转)

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  6. Android 推送通知指南(转载)

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  7. Android推送技术总结

    Android推送技术总结 Android平台接入推送机制一般有两种,一种是Google官方提供的C2DM云端推送方案:另外一种是第三方,如极光.个推和友盟等推送平台. C2DM云端推送方案 1)简单 ...

  8. android显示通知图标大全,Android推送通知:图标未显示在通知中,而是显示白色方块...

    Android推送通知:图标未显示在通知中,而是显示白色方块 我的应用会生成通知,但我没有显示为该通知设置的图标.相反,我得到一个白色方块. 我已经尝试调整图标的大小(尺寸720x720,66x66, ...

  9. Android推送的群魔乱舞

    前言 国内的Android推送就是个悲剧 国内Android缺少Google的生态,如Google的Paly Store,Google Mobile Services(GMS)等,导致衍生出很多畸形的 ...

最新文章

  1. PTA基础编程题目集-6-9 统计个位数字
  2. shell:syntax error:unexpected end of file/Starting proxy www-balancer: cannot bind socket--转载
  3. STM32F103外部晶振由8M变为12M
  4. python中对集合的操作
  5. ArrayList LinkedList与HashMap 实现原理
  6. 公有云关闭潮或显端倪,企业如何选择?
  7. 图像语义分割(14)-FastFCN: 重新思考语义分割模型主干网络中的扩张卷积
  8. PIC温控器c语言程序,PIC单片机温感器DS18B20 C语言程序代码
  9. 用java写一个算工作日期的功能(考虑到节假日以及补班的情况)
  10. Coherence X for mac(网站转换为mac应用的工具)
  11. 十行js代码实现windows上录屏功能
  12. 计算机的启动及关闭方法,如何关闭开机启动项
  13. Unity使用RenderTexture实现实时阴影绘制
  14. 什么是核心交换机?如何选择核心交换机?
  15. vb.net 获取系统图标_【系统更新V4】优麒麟 20.04 LTS持续完善!优化高清屏支持,上架6款新应用!...
  16. iview 表单验证问题 Select 已经选择 还是弹验证提示
  17. 基于PHP+MySQL简历模板下载管理系统
  18. java ssssss,在Java 7中将字符串日期转换为yyyy-MM-dd’T’HH:mm:ss.SSSSSS格式的字符串...
  19. 7-14 大小写转换 (10 分)(PTA题目)
  20. 并发三大特性——可见性

热门文章

  1. Automatic Updates服务无法启动
  2. Debouncing circuit(消抖电路)
  3. [转载] 生活小常识 :joke:
  4. ArcGIS API For JavaScript——空间查询(QueryTask)
  5. 如何使用go读写excel
  6. 技术要能够变现才有价值
  7. [重要] Cocos2dx 3.0 PageView ListView 在Android设备下背景显示为绿色的问题的解决方案
  8. webgame 上线版本控制
  9. Spark中DataFrame 基本操作函数
  10. 查找元器件_电子元器件-常用电子元器件基础知识大全