移动应用APP的网络优化三大重点方向即成功率、耗时与流量。其中,APP成功率即网络请求成功率,他的重要性直接体现于它能直接决定APP服务的可用性,直接影响到视频播放、广告展现、支付便捷等服务质量。本文将介绍爱奇艺APP对网络请求成功率优化的实践之路。
导致请求失败的因素
想要优化请求成功率先来了解移动端网络请求全链条可能导致请求失败的环节有哪些,这些环节往往由以下两类因素导致:
第一类,不可改善因素
iOS系统对APP的网络访问权限控制、飞行模式或者无网络连接。检测和识别这三种情况,通过适当方式提示用户。
路由器故障。
第二类,可以改善因素
对于不可改善因素,目前只能通过网络诊断识别出故障类型,引导用户手动去授权访问网络或者连接可用网络。其中,如果是路由器故障,可以引导用户重启路由器或者切换4G。通过爱奇艺APP的数据监控,大致可以看到用户无网连接的时长占比有3.8%左右,这说明提供好的无网提示变得十分重要,而从用户使用蜂窝信号的弱信号(0格和1格信号)时长占比有9%左右时长,也可以看出移动端网络环境的复杂性。
针对可以改善的因素可大致分为三类:
为了提高网络请求成功率,首先需要建立监控体系,从而使得基线网络库能够通过网络统计模块向APM投递各种维度的网络请求数据。有了APM的数据统计后,才能有效的发现导致端上网络失败的原因,进而解决问题。除此之外,由于端上网络请求数据巨大,存储空间的限制使得APM只能采样2%的用户,因此针对重点业务的网络请求(比如首页)则进行了全量采集,从而对成功率的优化实现更客观全面的评估。
基线网络库针对不同业务手段
除了单个重试手段可以重试多次,基础网络库也支持多种重试手段的组合,四种重试手段的优先次序为IP直连重试>超级管道重试>HTTP重试>原URL重试。扣除无网情况,首页推荐页CARD接口成功率通过组合重试在2020第一季度末达到了99.76%。
重试类型 | 成功率 | 备注 |
无重试 | 98.26% | - |
HTTP重试 | 99.42% | 原始URL是HTTPs会被改为HTTP,减少SSL握手带来的失败可能。同时确保HTTP1.1协议 |
超级管道重试 | 99.55% | 超级管道是IP直连的HTTP请求,减少了DNS解析和SLL握手带来的失败可能。同时确保HTTP1.1协议。 |
2 * 超级管道重试 + HTTP重试 | 99.76% | 两次超级管道,确保超级管道的异地容灾能力被激活,HTTP重试是对超级管道的兜底策略。 |
网络请求成功率因素
提高鲁棒性并防止故障措施
在完成优化后,爱奇艺APP基础网络库的构成如下:
统一网络库提供一个网络接口层,所有业务接口都对接使用网络接口层。
统一网络库提供一个网络封装层,对接了iOS系统网络层NSURLSession、ASIHTTPRequest(基于CFNetwork)、和公司自研的长连接网关。
网络统计模块:将从业务调用开始到回调给业务方的各个环节的耗时及状态值,变成统计数据,上传到APM汇合。
网络诊断模块:对关键业务进行诊断,包括dns解析,ping,tcpconnect,trace等工具对具体IP进行分析,分析结果上传到APM汇合。
弱网检测模块:通过借鉴Facebook的弱网检测是基于网速拟合的网络等级分级,分为网络情况非常差(2G或者无网)、网络情况较差(3G)、网络情况一般、网络情况较好、网络情况非常好五个等级。
HTTPDNS模块:有效的解决了运营商劫持问题。
超级管道重试:基于HTTP的网关代理,具有异地容灾代理能力。
ipv4/ipv6模块:识别端上是ipv4 only环境、v4/v6双栈还是ipv6 only环境。
复合连接模块:可以在server IP缓存池选出最佳IP,手段包括目标IP连接竞速,IP历史请求统计数据排序。
网络日志模块:记录了最近发生的失败网络请求详细数据和网络诊断数据。随反馈一并提交,可以便捷的排查线上网络问题。
目标与优化措施
为了持续优化网络成功率,下一步目标是扣除无网情况,重点业务成功率达到99.9%。后续考虑的优化措施如下:
Multipath
当Wifi假连接的时可以走蜂窝流量,iOS9开始支持Multipath特性。
QUIC
QUIC是基于UDP的,由于运营商对UDP有针对性的丢包,实测QUIC并没有体现出优势。然而,考虑到libcurl在2019已提供完整QUIC能力,NSURLSession不久也会支持QUIC。随着运营商对UDP包的干扰减少,QUIC的优势将得到体现。
智能调度并发
更精准更灵敏的弱网识别,弱网下对关键核心业务进行倾斜。
HTTPDNS的push能力
HTTPDNS打通APM的质量监控体系后,通过push及时下线故障IP。
也许你还想了解2020爱奇艺卡通人物检测识别挑战赛,点击“阅读原文”,前往大赛通道!
扫一扫下方二维码,更多精彩内容陪伴你!