网路优化篇-如何大幅度提高端上性能

前言

       今天要跟你们聊得是,如何大幅度提高端上网络的性能。端上网络性能怎么样,主要由两个指标来衡量,响应时间和成功率。响应时间指的是 从发起请求到接收到响应的时间。而成功率指的是,成功请求数(非异常)/总请求数。面试

       相信你们的app中都有统计这些数据,那么,你端上的响应时间够短么,请求成功率够高么。后端

为何响应慢

       咱们来想一下,端上的接口响应时间为何慢呢?首先,咱们先看一下,一次http请求要经历什么样的过程。api

  1. DNS解析出IP
  2. 三次握手创建链接
  3. 数据序列化、传输
  4. 后端处理、返回
  5. 反序列化

       上面是一个比较粗糙的过程,你们简单看下就行。那么,咱们来简单分析一下。bash

       DNS解析快么?在网络优化篇-从DNS开始 这篇文章中,已经分析过DNS解析了,事实证实,DNS解析是漫长的,尤为在端上,有时长达几百ms。微信

       三次握手快么?快,也不快。你想一想,即便是在有链接池优化的前提下,整个应用的生命周期内仍是要通过无数次三次握手,那么,最好的方式是什么呢?一次链接,处处使用网络

       序列化、反序列化、包压缩暂时不在咱们今天的考虑范围内。架构

成功率为何低

       端上的网络请求不免遇到超时,链接失败,IO异常,DNS解析异常等等多种错误状况。当你在遇到这些状况时,没有补救措施,固然成功率低了。app

引入长连接

       在知道了种种缘由以后,咱们引入了长连接。将网络请求经过长连接发送到后端gateway,后端gateway进行转发便可。以OkHttp为例,咱们能够很轻松的使用拦截器,将网络请求拦截下来,而后经过长连接发送出去。须要注意的是,这个拦截器要加在ConnectInterceptor以前性能

这是一个转换器接口的例子,功能是将Http协议的Request转换为长链协议的Request,将长链协议的Response转化为Http协议的Response。优化

public interface CoreConvert<U, D> {

  CoreHttpRequest convertToU(U request);

  D convertToD(U request, CoreHttpResponse response);
}
复制代码

       作了这些就够了么?不够,远远不够,咱们还须要作两件事。1. 互备 2. 动态调整。

长连接和Http互相兜底

       谁都没法保证长连接必定可靠,也没法保证http短连接可靠。所以,咱们还须要作的是,当一种链路出现问题的时候,切换到另外一种链路重试一下。这样,能够减小失败率,经过这种方式,咱们端上的成功率从92%提高到了99%+,提高很是明显

动态调整

       那么,这里指的动态调整是什么呢?虽然咱们引入了长连接,理论上长连接要比http短连接快不少,可是,事实却不必定是这个样子。所谓的动态调整,指的是咱们不断的经过相应时间去分析出长连接和短连接的质量,而后选择让api请求走短连接仍是长连接。经过这样不断的调整,可以帮助咱们在链路选择上,自动调度到比较好的链路中,提高网络质量。

最后

整篇下来,可能理论偏多,可是这一套理论已经在咱们目前的端上验证了很长时间,事实证实,是可行的。而且改形成本不高,对业务无感知,零侵入。

以为写的还行的朋友能够关注如下个人微信公众号,这里用于交流一些Android基础架构、疑难杂症、面试等等问题。

相关文章
相关标签/搜索