网络优化纬度
介绍
正确认识:
网络优化纬度:多维
仅仅重视流量不够
网络流量的消耗:精确
整体均值掩盖单点问题
网络相关监控:全面
粗粒度监控不能帮助我们发现、解决深层次的问题
纬度
流量消耗
- 一段时间流量消耗的精准度量,网络类型、前台后台
- 监控相关:用户流量消耗均值、异常率(消耗多、次数多)
- 完整链路全部监控(Request、Response),主动上报
网络请求质量 - 用户体验:请求速度、成功率
- 监控相关:请求时长、业务成功率、失败率、Top失败接口
其它 - 公司成本:带宽、服务器数、CDN
- 手机耗电
误区
只关注流量消耗,忽略其他纬度
只关注均值、整体,忽略个体
网络优化工具选择
NetWorkProfiler
显示实时网络活动:发送、接收数据及连接
需要启用高级分析
只支持HttpURLConnection和OkHttp网络库
抓包工具
Charles(java开发,跨平台)
- 断点功能
- Map Local
- 弱网环境模拟
Fiddler
Wireshark
TcpDump
Stetho
强大的应用调试桥,连接Android和Chrome
网络监控、视图查看、数据库查看、命令行扩展等
使用:
com.facebook.stetho:stetho-okhttp3:1.5.0
Stetho.initializeWithDefaults(this);
addNetworkInterceptor
Chrome浏览器:chrome://inspect
精准获取流量消耗
线上线下流量获取
前台后台流量获取
问题思考
如何判断App流量消耗偏高
- 绝对值看不出高低
- 对比竞品,相同case对比流量消耗
- 异常监控超过正常指标
测试方案
- 设置----流量管理
- 抓包工具:只允许本App联网
- 可以解决大多数问题,但是线上场景线下可能遇不到
线上流量获取方案
TrafficStats:API18以上重启以来的流量数据统计
getUidRxBytes(int uid)指定Uid的接收流量
getTotalTxBytes()总发送流量
总结:
无法获取某个时间段内的流量消耗
NetworkStatsManager:API23之后的流量统计
可以获取指定时间间隔内的流量信息
可以获取不同网络类型下的消耗
前后台流量获取方案
难题:线上反馈App后台跑流量
只获取一个时间段的值不够全面
后台定时任务-》获取间隔内流量-》记录前后台-》分别计算
上报APM后台-》流量治理依据
总结:
有一定误差,可接受范围内
结合精细化的流量异常报警针对性的解决后台跑流量
网络请求流量优化
使用网络的场景
数据:Api、资源包(升级包、H5、RN)、配置信息
图片:下载、上传
监控:APM相关、单点问题相关
数据缓存
服务端返回加上过期时间,避免每次重新获取
节约流量大幅提升数据访问速度,更好的用户体验
OkHttp、Volley都有较好的实践
增量数据更新
加上版本的概念,只传输有变化的数据
配置信息、省市区县等更新
数据压缩
Post请求Body使用GZip压缩
请求头压缩
图片上传之前必须压缩
优化发送频率和时机
合并网络请求、减少请求次数
性能日志上报:批量+特定场景上报
图片相关
图片使用策略细化:优先缩略图
使用WebP格式图片
网络请求质量优化
质量指标
网络请求成功率
网络请求速度
Http请求过程
- 请求到达运营商的Dns服务器并解析成对应的IP地址
- 创建连接,根据IP地址找到对应的服务器,发起一个请求
- 服务器找到对应的资源原路返回访问的用户
DNS相关
- 问题:DNS被劫持、DNS解析慢
- 方案:使用HttpDNS,绕过运营商域名解析过程
- 优势:降低平均访问时长、提高连接成功率
协议版本升级
1.0:版本TCP连接不复用(slow start)
1.1:引入持久连接,但是数据通讯按次序进行
2:多工,客户端、服务器双向实时通信
网络请求质量监控
接口请求耗时、成功率、错误码
图片加载的每一步耗时
网络容灾机制
备用服务器分流
多次失败后一定时间内不进行请求,避免雪崩效应
其它
CDN加速、提高带宽、动静资源分离(更行后清理缓存)
减少传输量,注意请求时机及频率
OkHttp请求池
网络体系化方案建设
线下测试相关
方案:只抓单独App
侧重点:请求有误、多余,网络切换、弱网、无网测试
线上监控相关
服务端监控
请求耗时:地域、时间段、版本、机型
失败率(业务失败与请求失败)
Top失败接口、异常接口
客户端监控
接口的每一步详细信息(DNS、连接时间、请求、网络包大小)
请求次数、网络包大小、失败原因
图片监控
异常监控体系
服务器防刷:超限拒绝请求
客户端:大文件预警、异常兜底策略
单点问题追查