--实现方式: 周期性主动获取网络中的数据;
--缺点: 费电, 费流量;
--实现方式: 服务器端向手机端发送短信, 手机监听短信广播, 将拦截的短信信息进行显示;
--优点: 省电, 省流量, 在没有网络的偏远地点也能接收到推送消息;
--缺点: 费钱, 一毛钱一条;
--实现方式: 手机端与服务器端建立一条长时间的数据流连接, 手机客户端一直等待服务器端的数据;
--优点: 有一条长连接, 有数据的时候才发送数据, 没有时不消耗流量, 比较省流量;
--缺点: 由于要保存一条长连接, 比较费电; 在网络不稳定的情况下, 推送容易失败;
短连接与长连接
--短连接:例如普通的web请求,在三次握手之后建立连接,发送数据包并得到服务器返回的结果之后,通过客户端和服务端的四次握手进行关闭断开。适用于网页浏览等数据刷新频度较低的场景。
--长连接:区别于短连接,由于三次握手链接及四次握手断开,在请求频繁的情况下,链接请求和断开请求的开销较大,影响效率。采用长连接方式,执行三次握手链接后,不断开链接,保持客户端和服务端通信,直到服务器超时自动断开链接,或者客户端主动断开链接。适用于客户端和服务端通信频繁的场景,例如聊天室,实时游戏等。
连接断开
外界原因
断电,服务器宕机等
NAT超时
IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机可以跟 Internet 的服务器通讯。
大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰 NAT 表中的对应项,造成链路中断。
长连接心跳间隔必须要小于NAT超时时间(aging-time),如果超过aging-time不做心跳,TCP长连接链路就会中断,Server就无法发送Push给手机,只能等到客户端下次心跳失败后,重建连接才能取到消息。
其他原因
心跳与轮询
主机在检查与从机之间的连接(判断与从机之间的连接是否断开)时,一般有心跳与轮询这两种方式。这两个方式都需要主机定时逐个查询从机的状态,但它们的策略有所不同。
在轮询方式中,主机逐个查询的方式是主动向从机发送一条查询信息,然后根据从机的应答情况来判断从机的状态。比方说,主机要求从机返回一个状态码来代表当前从机所处的状态,但如果从机没有应答,就认为与从机之间的连接已经断开。
在心跳方式中,主机逐个查询的方式是直接从一种状态信息表中查询,此状态信息表上记录了所有从机的状态信息,而此状态信息表是由各个从机自己主动去更新的。如果有从机长期没有去更新此表,就认为与该从机之间的连接已经断开。
可以看出,相对于轮询,心跳方式避免了主机等待各个从机应答的过程,从而减轻了主机的压力,在遇到从机数量庞大的情况,往往采用心跳方式。
实现方案
C2DM
全称 Cloudto Device Messaging, Google 提供的 推送解决方案;
--运行方式: 提供一个轻量级机制, 允许服务器通知应用程序, 主动与客户端进行数据交互, 处理消息排队, 并向运行于目标设备的应用程序分发消息;
--优点: Google 提供的原生框架, 无需在应用中添加第三方代码 和 部署服务器端;
--缺点: 1.该推送依赖 Google 服务器, 需要绑定 Google 帐号, 目前在中国 Google 被屏蔽, 无法使用; 2. 许多手机厂商去掉了软件中的该模块;
--运行机制图:
基于XMPP的AndroidPN
--XMPP 简介: 全称 Extensible Messaging and Presence Protocol (可扩展通讯和表示协议), 基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测, 该协议允许因特网用户向因特网上的其他任何人发送即时消息;
--AndroidPN: 基于 XMPP 协议开发的 Java 开源 Android 推送通知实现, 包含了完整的客户端 和 服务器端;
--项目主页: http://sourceforge.net/projects/androidpn/ ;
极光推送
功能概述
极光推送基本功能:主动即时的向用户发起交互, 可以发送聊天消息;
--作用: 通过向精准的目标用户推送有价值的消息, 可以提供用户忠诚度, 提高留存率;
1. 推送方式
推送方式简介:
--通知: 推送文本内容, 展示在通知栏中;
--自定义消息: 推送自定义消息, 给用户自行处理;
--富媒体: 推送 HTML 页面内容;
2. 推送目标
推送目标简介:
--广播推送: 向所有用户发送广播消息;
--标签推送: 根据用户设置的标签分组, 向某一组推送消息;
--别名推送: 客户端绑定用户别名, 向单个用户推送信息;
3. 用户分群
用户分群简介: 可以根据 JPush 提供的多条件组合, 对用户进行群组划分, 实现实时筛选推送;
4. 推送历史
推送历史简介: 通过 WEB 或者 API 发出的推送, 都可以在推送历史记录中查询到, 并可以实时显示推送结果;
推送框架
推送框架:
--推送数据源: 自己开发的服务器端 或者 使用 极光推送官网的 WEB 后台;
--JPush API: 部署在服务器端, 开发者的服务器端发起推送时, 将数据传到 JPush API 中, 然后再向下传递;
--建立长链接: 集成 JPush 的 SDK 客户端启动后会建立一个到 JPush Cloud 的长链接, 提供 App 永远在线的能力;
--原理图:
极光推送原理
1. 客户端原理
IP地址 分配原理:
--IP 地址有限: IPv4 的 IP 地址数量有限, 运营商要动态地为 手机分配 IP 地址, 这些 IP 地址都是运营商的内网 IP;
--网络地址转换 (NAT): 全称 Network Address Translation, 网关维护一个外网 IP 地址, 与 内网 IP 地址对应;
--外网 IP 不固定: 由于运营商持有的外网 IP 数量有限, 需要动态的分配给接入运营商的用户, 因此在手机一段时间没有数据传输时会将该手机分配的外网 IP 地址收回, 分配给其它用户;
--解决方案: Android 手机端想要保持长链接, 首先外网 IP 地址不能变, 不能让运营商收回 这个 IP 地址;
Android 手机端实现方案:
--心跳: 为了长时间保持外网 IP, 需要客户端定期发送心跳给运营商, 以便刷新 NAT 列表;
--Timer 定时方法: 该类计划循环执行定时任务, 但是使用该类会使 CPU 保持唤醒状态, 比较费电;
--AlarmManager 定时方法: 该类封装了 Android 手机的 RTC 硬件时钟模块, 可以在 CPU 休眠时正常运行, 定时任务执行时再唤醒 CPU, 这样做到了电量节省;
2. 服务器原理
C10K 问题: 单台服务器解决 同时保持一万长链接的性能问题;
Android SDK 简介
Android SDK 本质: JPush SDK 集成到 Android APP 中后,作为一个 Service 在 Android 端长期运行, 始终与 服务器端 保持者长链接, 相当与永远在线;
1. 多平台支持
多平台支持:
--手机芯片类型: 一般的手机是 ARM 芯片, 但是有些手机是 MIPS 芯片 或者 x86 芯片
--so 库支持: 每个 CPU 芯片类型对应的 so 库, 都需要特殊编译, 无法跨平台调用, 如 ARM 平台的 so 库在 x86 平台就无法运行;
2. 电量与流量说明
流量消耗: JPush 的协议是自定义的, 协议的数据量经过了精简, 流量消耗非常少;
电量消耗: JPush 心跳保持连接时可以在 CPU 不唤醒的情况下执行, 减少了不必要的代码运行, 电量非常节省;
3. 相关库说明
JPush 依赖库:
--.so 依赖库内容: JPush 需要一个 so 动态库, 该库是 C 语言编写, 在 Linux 下进行交叉编译而来, 可以在 ARM 芯片的手机上运行;
--jar 依赖库内容: 对 Java 代码的封装;
集成教程
登录 · 天智AgileTeam
1.推送名词解释
https://go48pg.yuque.com/go48pg/pa41sm/xzqqgm?#%20%E3%80%8A%E6%8E%A8%E9%80%81%E5%90%8D%E8%AF%8D%E8%A7%A3%E9%87%8A%E8%AF%B4%E6%98%8E%E3%80%8B
2.对接指南
https://go48pg.yuque.com/go48pg/pa41sm/dmq2dw?#%20%C2%A0%E3%80%8A%E6%9E%81%E5%85%89%E6%8E%A8%E9%80%81%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97%E3%80%8B
3.客户端集成插件
极光文档
排错文档
https://go48pg.yuque.com/go48pg/pa41sm/dx53wi?#%20%E3%80%8A%E6%8E%92%E6%9F%A5%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%EF%BC%88%E6%B6%88%E6%81%AF%E6%9F%A5%E8%AF%A2%EF%BC%89%E3%80%8B
https://go48pg.yuque.com/go48pg/pa41sm/qy4fle?#%20%E3%80%8A%E9%80%9A%E7%9F%A5%E5%B1%95%E7%A4%BA%E7%9B%B8%E5%85%B3%E9%97%AE%E9%A2%98%E3%80%8B
https://go48pg.yuque.com/go48pg/pa41sm/ruxieh?#%20%E3%80%8ARid&msgid&Appkey%E8%8E%B7%E5%8F%96%E5%8A%9E%E6%B3%95%E3%80%8B
Safe(安全),Stable(稳定),Save(省电省流量省成本),Slim(体积小);
推送安全标准
--透明传输: 只负责点对点的传输的质量, 不关心中间的传输介质 与 传输业务逻辑 协议等;
--加密方案: 信息需要加密, 另外推送的 ID 系统需要独立与后台已有的 ID 系统;
服务器稳定: 长链接方案对服务器开销要求很高, 服务器端开发难度很大;
--在线峰值: 同时在线连接数到达100万的稳定性;
--并发时延: 高并发时的消息平均延迟, 一分钟处理 100万 条数据;
--服务器稳定: 稳定性时延占总时间的 99.9%, 有备份和负载均衡的机制;
客户端稳定: 中国网络状况复杂, 手机长时间联网比较难, 稳定性比较难, 开发时要考虑每个省的每个运营商, 每款手机的机型
--联网时间: 每日联网时间 23.5 小时以上;
--消息到达率: 消息收到后 9 小时内客户端的消息到达率;
节省评判:
--电量节省: 注意 CPU 休眠率, 服务短待机时间百分比评判;
--流量节省: 处理协议 和 冗余数据包, 使用空载待机月流量评判;
--成本节省: 单服务器同时承载连接数, 同时承载连接数越多, 成本越低, 个推单服务器连接 300 万(业内顶尖水平);
集成 SDK 大小: 客户端推送的 SDK 的大小尽量小, 一般要小于 300K;