做者:凝睇,蚂蚁金服移动开发平台 mPaaS 技术专家。目前负责蚂蚁金服移动开发平台 mPaaS 服务端组件体系优化与架构设计。 内容采编自 CodeDay#1 杭州站现场分享,主题是《弱网优化在支付宝的深度实践》。git
现场视频: tech.antfin.com/activities/…github
随着 PC 端场景愈来愈重,其发展已日趋饱和,而随着智能移动设备的兴起,移动互联网呈现出了井喷式发展形态。相比于 PC 互联网时代的有线网络,无线网络通讯的稳定性却有着巨大的差异;所以,开发者总会面对用户反馈诸如 App “不通”、“不快”等各类“网络问题”。算法
做为国民级 App,支付宝须要服务在各类复杂的移动网络环境下的亿级用户,于是在网络优化的道路上也是一走就不少年,本文的目的便是将咱们遇到的问题作一个总结,并把在一些实际可行的优化和实践经验分享给各位开发者,指望能从某个角度能给各开发者提供一些灵感以帮助你们建设更好的移动 App。数据库
问题归总后端
网络问题,从用户反馈过来的表象可分为“不通”或者“不快”,这两词虽然只有一字之差,但本质却彻底不一样:缓存
对于“不通”的问题,主要缘由为客户端真实网络确实不可用或者服务端系统稳定性不足致使,从优化的角度,更偏向于优化服务端架构设计或者从交互角度让客户端在异常状况如何更友好的呈现给用户,而对于“不快”的问题,咱们则可从技术上作更多的优化和改进,于是也是本文的重点。安全
问题来源性能优化
首先咱们来看一下移动网络的链路:服务器
因而可知,移动网络自己链路上就相较有线网络复杂不少,同时终端由于其强烈的“移动”属性,在不少场景下网络状况确实不如人意,好比在地下室、电梯、偏远地区等等,总会带来带宽不足、频繁丢包、高延迟的问题。与此同时,在进入后端服务器应用网络以后还有一层层的防火墙、路由器、负载均衡、IDC 分机房部署。 再到客户端应用程序、服务端的系统设计、接口设计等问题也会极大的影响到在弱网环境下用户的体验,如:网络
除此以外,传统网络协议在流程设计上限定,若是移动 App 自身没有进行改良和优化,在弱网环境下也可能会成为绊脚石。
如:
作优化必定须要有可量化的指标来衡量和记录咱们的劳动成果和效果,所以,能够主要从如下几个指标入手:
其中各类指标均须要区分网络类型(WiFi、4G、3G等等)、机型等参数进行分别监控,至于其余的数据则可根据不一样场景继续延伸挖掘,并可针对诸如“当面付”等重点业务作专题分析。
在前面的章节已经有提到,根据移动网络的特性,咱们能够分别从网络链路上,客户端&服务端流程设计以及网络协议上下手,在实际的操做过程当中,则经过如下几方面开展:
网络服务架构升级
如图中所示,客户端可拆分为主进程和 Service 进程,主进程主要承载具体的功能组件和业务模块,Service 进程则主要负责与服务端进行网络协议和网络数据对接,并负责进程保活。
在穿过公网、LVS、以及一系列防火墙、路由器以后,进入后端具体应用可直接感知 SLB,在这以后才正式进入咱们可操做和优化的后端架构:AccGW、ApiGW(MGS)、SyncGW(MSS)、PushGW(MPS),并由 LinkMng 来统一管理终端的链接信息和链接生命周期,移动调度这使用 MDC 配合 HTTPDNS 来完成。
AccGW
接入网关目前由 Spanner 来承接:
Spanner 是蚂蚁集团基于 Nginx 二次开发的一套事件驱动型系统,其主要功能大体可分为:
MSS 消息同步服务
在基础服务架构升级中,MSS(SYNC)的出现一样扮演了及其重要的角色:
在以前的文章中已经有介绍 MSS 是经过一个安全的数据通道 TCP+SSL,及时、准确、有序地将服务器端的业务数据,主动的同步到客户端 App,其定位是一个客户端与服务端之间的消息中间件。
MSS 主体思想是:相似 MySQL 数据库 binlog 原理的基础上定义了一个 oplog 概念,服务器和客户端 SDK 之间传递的最小数据单元被称为一个 oplog,每当业务须要同步一个数据变动到指定的用户/设备的时候,业务调用MSS服务端的 SyncData 接口,MSS 会将业务须要同步的数据变动包装为一个 oplog 持久化到数据库,而后在客户端在线的时候把oplog 推送给客户端,若是当前则当即触发推送。每一个 oplog 拥有一个惟一的 oplog id,oplog ID 在肯定的用户、肯定的业务范围内保证惟一而且单调递增(按调用顺序)。MSS 按照 oplog ID 从小到大的顺序把每一条 oplog 都推送到客户端。经过 ACK 机制服务端和客户端均会记录客户端已同步数据的最大 oplog ID(亦可理解为数据版本),后续产生新数据时进行差量计算和差量同步。
经过 MSS 能够给客户端带来几大好处:
这些优点可很是有效的减小客户端 RPC 接口交互次数,减小须要传输的业务数据内容,并因为其主动推送的特性又可极大的提高用户的体验效果。
移动调度
在移动调度的升级上,采用的是 MDC 配合 HTTPDNS,传统的 DNS 有几大弊端:
经过 MDC 配合 HTTPDNS 则能够完美的解决以上问题:客户端经过独立的网络请求到服务器拉取可用的 IP 列表,IP 列表信息中已包含了服务端的机房、中心以及白名单相关信息,客户端在获取到 IP 列表以后既可根据当前用户(设备)信息在后面的网络请求中直接路由到对应的机房、中心、某台具体服务器或者海外 POP 加速站点。IP 列表可长期的保存在客户端中,后续的请求中均只须要经过本地 DNS 解析便可以完成 IP 映射,用以节省 1 次 RTT 请求时间,也能够有效的防范 DNS 域名劫持,于此同时可结合 MSS 等服务来指定实际更新策略来确保第一时间更新 IP 列表。此外,客户端也可经过按期检测、定制质量模型等方式来计算、评估获取最优 IP 地址。
协议优化
MMTP:全称蚂蚁移动传输协议,是二进制的 TLV(类型、⻓度、值)结构的协议;是并驾于 HTTP、HTTP2.0、spdy 的私有化传输协议。
其主要优势为:
MTLS:全称蚂蚁移动安全传输协议是基于 TLS1.3 扩展的安全传输协议。
TLS1.3 可经过证书 cache、session Ticket 等机制支持 1RTT 握手,加密套件则可选用ECDHE,根据有关数据验证,160 比特 ECC 密钥和 1024 比特的 RSA 密钥的安全性至关,小数据量在速度、效率、带宽、存储上都会体现出明显优点,此外在某些特殊功能上,甚至可使用 0RTT 的方式直接完成数据交互。
数据优化
序列化方式:目前在蚂蚁体现内已基本普及了 protobuf。Protobuf 全称 Google Protocol Buffer,是一种轻便高效的结构化数据存储格式,主要知足结构化数据串行化,或者说序列化。它很适合作数据存储或 RPC 数据交换格式。可用于通信协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
而经过 protobuf 官方工具生成的客户端文件较大,可能会引发安装包过大,函数方法过多等问题,蚂蚁内部在此基础上又从新定制了生产工具,最终产出物被定义成 HybridPB。
ZSTD 压缩算法:在上一代产品中业务数据 body 主要使用的 gzip 压缩,而在目前的产品中则主要采用了 ZSTD 压缩:
ZSTD 全称 Zstandard,是一款免费的开源,快速实时数据压缩程序,具备更好的压缩比,由 Facebook 开发。 它是用 C 语言编写的无损压缩算法 (在 Java 中有一个从新实现) , 所以它是一个本地 Linux 程序。在移动网络中,它能够须要将压缩速度交换为更高的压缩比率(压缩速度与压缩比率的权衡能够经过小增量来配置),它具备小数据压缩的特殊模式,称为字典压缩,能够从任何提供的样本集中构建字典。更高的压缩比意味着更小的网络传输成本消耗,而这也是在移动端被采用的主要缘由之一。
链接策略
TCP 建连行为由移动终端发起:目前主要在终端启动时、先后台切换时、网络超时、链接错误或者网络类型切换时会发生建连动做,而建联的策略上主要由如下几种:
对于链接的保持,传统的作法就是心跳,心跳包可由客户端发起,也可由服务端发起。因为移动端终端的运营商、手机厂商等各类定制、非定制的因素干扰,对于 TCP 链接保持能力上各不相同,所以恒定的心跳时间未必能知足各类状况,过快、过慢都会带来问题,所以支付宝采用的是动态心跳的方式来维持链接,客户端经过必定的质量模型来评估某一心跳周期的链接维持质量,并在过程当中逐步增长或减小心跳周期,在到一个最优的模型质量以后记录下最优心跳时间,并用改周期时间来维持以后的一段时间。
链接超时控制上:除了传统的业务请求超时和建连超时,还引入了包 sequence 概念,每一个上行包发送时,加入递增序号,服务端收到带序的包后,若是有下行包,就把当时收到的最大序号返回给客户端。客户端收到后,既可确认全部小于等于这个序号的上行包都已被服务端接受;若是某个上行包的序号在一段时间尚未收到确认,可怀疑出现“假链接”,须要进入回收评估阶段,服务端下行包亦然。
在上面的内容中,咱们一直在基础服务上作文章,而实际的生产过程当中,业务接口的设计也极大的影响着用户的真实网络体验,而且因为业务在持续发展,人员也持续的迭代,对于优化的规范和设计的思路上并不是都在同一水平上,所以业务治理绝对是一个须要持续坚持不懈战斗的过程。在业务治理过程当中也可总结为几个方面:
最后: 锲而不舍。不管是性能优化、网络优化,都是一个长期的过程,这也将伴随着整个终端和服务端的生命周期,所以锲而不舍的优化改进才是重中之重。
*注(更多详细内容):
进一步学习「protobuf」:
进一步学习「ZSTD」:
进一步学习「HPACK」:
| 移动开发平台 mPaaS 三款组件重磅上线蚂蚁金服开放平台:
往期阅读
《蚂蚁金服 mPaaS 服务端核心组件体系概述:移动 API 网关 MGS》
《蚂蚁金服 mPaaS 服务端核心组件:亿级并发下的移动端到端网络接入架构解析》
钉钉群:经过钉钉搜索群号“23124039”
期待你的加入~