网络请求优化
网络请求优化可以从以下几个纬度进行思考
- 减少网络请求耗时
- 提高资源请求效率
- 减轻服务端压力
CDN
使用 CDN 可以有效提升请求效率,减轻源服务器压力,但是要注意只有静态资源才适合使用 CDN,比如图片、HTML 文件、模版等不经常改变的数据。
原理
CDN 的原理就是在各个位置部署 CDN 服务器,用户在发起请求时,直接请求距离最近的 CDN 服务器,可以避免因为地理位置太远导致的耗时高。用户请求 CDN 服务器时,CDN 服务器会优先去缓存中寻找目标数据。
如果有则命中缓存,直接返回。命中缓存可以有效提升访问速度。
如果没有命中缓存或者缓存已经过期,CDN 服务器会去源服务器请求数据并返回给客户端,同时将数据缓存。
预热
预热就是提前让 CDN 去源服务器请求数据并缓存,保证用户在首次访问到 CDN 服务器时能够直接命中缓存,而不需要请求源服务器。
比如在上线新活动之前,可以提前预热 CDN,不仅能加快首批用户的请求时间,还可以减轻源服务器的压力
刷新
刷新分为 URL 刷新和目录刷新
URL 刷新是直接将 CDN 节点上的缓存文件直接删除。重新请求最新的资源
目录刷新是将 CDN 节点上的文件标记为过期,但是会和源站对比过期时间,只有真正过期的数据才会重新请求。
本地 DNS 映射
网络请求的第一步基本都是 DNS 解析,而 DNS 解析的耗时跟当时所处的网络环境有很大关系,虽然 DNS 解析是有 cache 的,但是因为 cache 有过期时间,所以不能保证每次请求都能命中 cache。如果可以节省掉这部分时间对网络性能是有一定提升的。
DNS 解析说简单点无非就是输入域名,输出 IP 地址,那么 DNS 映射就是模拟了这一个行为,在客户端本地维护一个映射表,避免发起 DNS 解析。
但是简单的映射不能 cover 住所有场景,还需要以下能力进行兜底
- 映射表需要有版本概念,定期从服务器更新最新版本的映射表
- 可以强制推送新的映射表给客户端,避免本地长时间使用错误的映射表
- 映射的 IP 无法使用时可以回滚使用默认的 DNS 解析服务
链接复用
HTTP 请求支持复用,在 header 里设置 Keep-Alive 参数,用于告知服务器保存这个链接,后面还会继续使用。
一次请求的过程大概可以分为 DNS 解析 -> TCP -> SSL 三个步骤,如果多个请求的域名是相同的,可以复用同一个链接,节省频繁建立链接带来的开销。
预链接
预链接是在链接复用的基础上的优化,在 APP 启动后,提前为后续重要的请求建立好 HTTP 链接,等真正发起请求时就可以复用这个链接,减少请求耗时。