转 Andriod实现推送的解决方案( 二 )


GGSN( GPRSNode 网关GPRS支持结点)模块就实现了NAT功能 。
因为大部分移动无线网络运营商都是为了减少网关的NAT映射表的负荷 , 所以如果发现链路中有一段时间没有数据通讯时 , 会删除其对应表 , 造成链路中断 。(关于NAT的作用及其原理可以查看我的另一篇博文:关于使用UDP(TCP)跨局域网 , NAT穿透的心得)Push在平台上长连接的实现:
既然我们知道我们移动端要和进行通信 , 必须通过运营商的网关 , 所以 , 为了不让NAT映射表失效 , 我们需要定时向发送数据 , 因为只是为了不然NAT映射表失效 , 所以只需发送长度为0的数据即可 。
这时候就要用到定时器 , 在系统上 , 定时器通常有一下两种:
1.java.util.Timer
2..app.
分析:
Timer:可以按照计划或者时间周期来执行相关的任务 。但是Timer需要用来让CPU保持唤醒状态 , 才能保证任务的执行 , 这样子会消耗大量流量;当CPU处于休眠的时候 , 就不能唤醒执行任务 , 所以应用于移动端明显是不合适 。
:类是属于系统封装好来管理RTC模块的管理类 。这里就涉及到RTC模块 , 要更好地了解两者的区别 , 就要明白两者真正的区别 。
RTC(Real- Time Clock)实时闹钟在一个嵌入式系统中 , 通常采用RTC 来提供可靠的系统时间 , 包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电) , 它的外围也不需要太多的辅助电路 , 典型的就是只需要一个高精度的32. 晶体和电阻电容等 。(如果对这方面感兴趣 , 可以自己查阅相关资料 , 这里就说个大概)
好了 , 回来正题 。所以 , 又称全局定时闹钟 。这意味着 , 当我用使用来定时执行任务 , CPU可以正常地休眠 , 只有在执行任务是 , 才唤醒CPU , 这个过程是很短时间的 。下面简单来说明其使用:
1.类似于Timer功能:
//获得闹钟管理器
am = ()();
//设置任务执行计划
am.(., , 5*1000, );//从才开始执行 , 每隔5秒再执行
2.实现全局定时功能:
//获得闹钟管理器
am = ()();
//设置任务执行计划
am.(.EUP, , 5*1000, );//从才开始执行 , 每隔5秒再执行总结:在客户端使用Push推送时 , 应该使用来实现心跳功能 , 使其真正实现长连接 。在服务器端的实现:
在服务器端 , 可以使用很多语言来实现 , 如C/C++,java,等等 , 如我们国内比较好的极光推送(C开发),(java开发)等等 。
最近我看了极光推送的介绍和原理 , 下面我就说说他们是遇到什么难题 , 然后使用什么技术或者方案来解决呢 。
当有大量的手机终端需要与服务器维持长连接时 , 对服务器的设计会是一个很大的挑战 。
假设一台服务器维护10万个长连接 , 当有1000万用户量时 , 需要有多达100台的服务器来维护这些用户的长连接 , 这里还不算用于做备份的服务器 , 这将会是一个巨大的成本问题 。那就需要我们尽可能提高单台服务器接入用户的量 , 也就是业界已经讨论很久了的 C10K 问题 。
针对这个问题 , 他们专门成立了一个项目 , 命名为 , 顾名思义 , 他们的目标是单机维持200万个长连接 。最终他们采用了多消息循环、异步非阻塞的模型 , 在一台双核、24G内存的服务器上 , 实现峰值维持超过300万个长连接 。