为什么到了2020年,“统一推送联盟”依旧无法起显著作用? - 知乎 https://www.zhihu.com/question/370632447

https://mp.weixin.qq.com/s/ZL1v2Tyl3OC0V8ZrSgax2A

淘宝APP消息推送模型

原创 机械猿 机械猿 2019-12-06

絮叨

之前讨论过TCP连接相关的问题:

手机上的APP是如何与服务器通信的

对于国民生态级APP,像淘宝天猫支付宝等,支撑大量扫码、AR、视频直播和实时聊天等业务,背后的服务器集群数十万计(算上国外POP点),必须要考虑网络质量的稳定性和消息到达的时效性。移动通信模块涉及的终端技术点很多,本文先从长连接讲起,将大型APP的通信原理和通信质量保障一点点理清。

一般APP主进程退出之后还会留一个push进程来接收服务端的推送消息,在安卓机上用过QQ微信或者支付宝的应该都有印象,明明把APP进程杀掉了,系统推送的消息还是能收到。一般大型APP都是自建http/tcp长连通道,小型app可以直接使用阿里云定制的推送功能。像即时聊天类APP如微信的消息收发非常及时,背后功劳就是这套长连接系统。不得不说,微信的消息推送质量基本高达98%,略高于阿里系的淘宝和支付宝。

长连接

之前面试阿里的时候,面试官问过一个问题:TCP的keepalive和http的keep-alive长连接有什么区别?两者的侧重点不太相同。客户端与服务端通信流程为:客户端dns请求获取服务端ip地址,之后经过tcp三次握手建立连接,tls握手交换对称密钥(这里如果中间证书过大的话还要中断握手先下载证书),然后才是http的数据通信。如果是短连接,数据传输完后服务端就会主动关闭连接,下次再发数据时又要经过上一次繁杂的握手流程。而http1.1里面的keep-alive字段就是为了告知双方继续保持这条连接,免去握手流程。而TCP的keepalive机制是启动一个定时器,如果双方两小时没有任何数据收发传输(两人都不说话),那么服务端会向客户端发送一个一字节探测报文,如果客户端没有回应,连续10次探测之后发送reset报文断开这条连接。

通知推送

安卓和iOS手机都能收到APP的推送消息,但是实现机制不一样。iOS是依靠系统内部的常驻推送进程与苹果自己的APNS服务器通信,转发淘宝服务器发出的通知。

而安卓不一样,是各家自己单独维护或者租用一条推送链路。安卓版APP一般除了执行数据运算的主进程之外,还会维持一条push进程用于长连接,主要是发送心跳包和接收自家服务推送,这也是安卓机内存越来越不够用的原因之一。

杀进程,一般是清除APP的主进程,push进程因为占用内存相对比较小,被系统杀掉的可能性不太高,在后台继续运行;有些软件在push进程被杀掉后还可以通过AlarmReceiver及时拉起进程。

目前几大主流手机厂家华米OV联合BAT和google推出了统一推送联盟,向iOS看齐,各大APP统一使用一条推送通道,好处主要有以下几点:

1、APP不需要特意保活,减少了手机内存占用和耗电量;

2、可以对推送消息统一进行权限管理和控制,减少垃圾消息;

3、减少APP厂商开发适配难度(想象一下用C++开发完Android版本马上用object-c开发iOS版本的蛋疼场景)

阿里系APP借鉴http协议自己实现了一套长连接机制,主要用于应对大量网络请求及信令包的传输,减少耗时,其次服务端可以主动使用push通道推送数据到客户端。这种情况如果采用客户端轮询机制实现的话会消耗服务器大量带宽,也会造成运营商信令风暴。长连接大体部署如下图:

注1:由于运营商NAT表老化,基本二十分钟(中国电信保活时间最长,为20分钟)后NAT表就会更新,这个时候服务端已经联系不上客户端了。后面会讲到客户端发送心跳包保活连接,主要也是这个原因。

注2:淘宝为什么不把服务端的IP直接写到程序里,而是要通过dns花费1rtt耗时通过运营商请求呢?主要是为了服务器集群容灾,其次是就近接入。

连接保活

为了解决上面说到的NAT超时导致连接断开的问题,通常的操作是客户端以略小于NAT超时的间隔发送心跳包。但是采用固定心跳方法,会增加手机功耗,消耗大量信令资源,而且不同WiFi信号下NAT超时通常较长如20min,如果继续采用5min心跳一次则浪费资源。因此淘宝采用智能心跳策略,动态逐渐递增探测到NAT时间后,探测思路借鉴了TCP探测拥塞窗口的思路。当APP处于后台时,为减少电量消耗及频繁唤醒系统,在前台熄屏或者刚进入后台时递增探测最长心跳时间,在后台稳定态(一般为10min)时采用最大心跳作为固定值。

此外,Android系统为减少系统频繁唤醒,提供了定时器对齐机制,即把一定时间段内的多个定时器中断唤醒合并成一个中断,这个思路也被很多嵌入式操作系统如freertos采纳,作为一个低功耗卖点。

假连接现象

当然长连接也不是一直保持着,移动网络跟有线网络相比环境复杂太多,移动通信需要考虑的点也很多,下面几种情况就会出现tcp假连接现象,也就是本地的socket资源还在,但是网络已经无法使用了。

1、切网

在电梯、地下室等弱网情况下,从有WiFi的地方走到4G网络覆盖的区域,虽然WiFi已经断开,但是手机进程里之前WiFi的信息还未清除,如果采用原来的IP通信肯定会失败。

2、后台清理进程

如果push进程被切入后台,那么安卓系统会在内存不足的情况下采用LRU算法清掉最久未使用的进程,push进程随时可能被杀掉。

3、NAT表老化

上文已经说明。

4、DHCP租期到期

Android系统在处理dhcp到期续约时在某些机型上会出现bug,这个时候本地IP地址无效,只能重新建立tcp连接。

周末探讨一下VPN对APP无线网络性能的影响。

为什么到了2020年,“统一推送联盟”依旧无法起显著作用? - 知乎 https://www.zhihu.com/question/370632447

淘宝APP消息推送模型的更多相关文章

  1. 浅谈APP消息推送

    作为移动端APP产品运营最重要的运营手段,消息推送(push)被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用 ...

  2. APP消息推送是否进入消息中心和click、receive事件分析

    前端时间研究APP消息推送的机制,由于机型.版本的碎片化,消息推送的机制不太好理解,所以总结下,放在博文里以备后续查阅. 安卓Android系统的消息推送:     安卓 推送方式 应用状态 类型 消 ...

  3. IOS开发之实现App消息推送

    转自:http://blog.csdn.net/shenjie12345678/article/details/41120637 第一部分 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps: ...

  4. IOS开发之实现App消息推送(最新)

    好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多 ...

  5. IOS8开发之实现App消息推送

    第一部分 Apple Push Notification Service 首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图. ...

  6. APP消息推送功能

    1.APP内部最好设计-我的消息-的功能,以便用户查看推送消息历史记录,通过角标.已读.未读等设计吸引用户读取消息.(画下来这都是重点) 2.建议提供推送设置功能,允许用户设置推送消息是否显示于通知栏 ...

  7. app消息推送

    Mui + 个推 实现消息推送 1.首先去个推 注册一个账号,新建一个消息推送应用 2.配置Mui配置文件 3.使用HBuilder 打包 app 4.然后在到个推后台 发送数据 后台Java代码(官 ...

  8. ios手机app消息推送

    h5+app项目,推送平台 " 个推 " 首先在manifest.json配置文件中点击模块权限配置,勾选push消息推送配置如图1-1 第二部在manifest.json配置文件 ...

  9. APP消息推送:通知和透传

    目前市场上的消息推送方式有两种:通知和透传.什么是透传?透传即是透明传送,即传送网络无论传输业务如何,只负责将需要传送的业务传送到目的节点,同时保证传输的质量即可,而不对传输的业务进行处理.透传消息, ...

随机推荐

  1. Hyperledger fabric 1.4 环境搭建(一)

    Hyperledger fabric 1.4 环境搭建(一) 1.更换下载源 更换apt的下载源,因为官方下载源很慢,需要更换到国内的镜像站 1.1.进入/etc/apt/目录 cd etc/apt ...

  2. 关于META-INF下的spring.factories文件

    spring.factories 文件是springboot提供的一种实例化bean方式 org.springframework.boot.autoconfigure.EnableAutoConfig ...

  3. CentOS7 实战源码部署apache网站服务器

    简介:实战演练apache网站服务器的搭建 Apache简介: Apache软件基金会的一个开源免费的网页服务器,也是目前世界上使用最广泛的一种web server , apache最出名的是它跨平台 ...

  4. springMVC搭建分布式框架

    https://www.cnblogs.com/lr393993507/p/7652717.html https://www.cnblogs.com/Tpf386/p/10987931.html

  5. JAVE JDK安装步骤

    1.安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目 ...

  6. 谈谈 Vue 模板和 JSX

    工具链 从学习曲线角度来讲,结合我个人体会,React 学习路线是比 Vue 陡峭的,这个和 JSX.Template 有关吗?当然有.在 React 中使用 JSX,众所周知, JSX 需要经过 T ...

  7. Java内存模型精讲

    1.JAVA 的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物理内存的一小部分 2.JAVA ...

  8. CountDownLatch/CyclicBarrier/Semaphore 使用过吗

    CountDownLatch 让一些线程堵塞直到另一个线程完成一系列操作后才被唤醒.CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被堵塞,其他线程调 ...

  9. Mirai框架qq机器人教程

    Mirai框架qq机器人教程 0.前言 1. 安装Java 2.安装Mirai启动器 3.下载IDEA或其他编译器 4.创建mirai-console插件项目 4.1 通过git创建 4.2 通过插件 ...

  10. phpstorm 注册码破解

    激活码1 812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2ln ...