HTTP用户体验优化 | 青训营

101 阅读5分钟

网络优化

使用HTTP2

  • Binary Framing:使用二进制格式分割和传输数据,二进制分帧使得数据传输更紧凑,降低了协议头的大小,而且更容易解析;
  • Multiplexing:支持多路复用,允许在单个连接上同时发送多个请求和响应;
  • Server Push:引入服务器推送功能,允许服务器再客户端请求之前主动推送相应的资源,可以避免客户端发起多个请求来获取所需资源,减少了延迟和等待时间;
  • Header Compression:使用HACKER算法对头部进行压缩,减少头部的大小,降低延迟和等待时间。

CDN动态加速

CDN-Content Delivery Network通过将内容分发并缓存到位于全球不同地点服务器上,来提高网站和应用性能:

  • 降低延迟,减少带宽消耗:通过分发和缓存机制,用户可以从距离更近的服务器获取数据,减少了数据传输的延迟,提高网站的响应速度,同时也降低源服务器的带宽使用量,减轻服务器的负担;
  • 提高网站性能:网站的静态资源可以缓存在CDN服务器上,从而减轻源服务器的负担。源服务器可以更专注于处理动态内容和业务逻辑,从而提高整体性能和可靠性;
  • 内容优化:另一方面,CDN提供内容优化功能,如压缩、图片优化和缓存策略等,可以帮助进一步减少页面大小和加载时间,提高网站性能。

DNS预解析

通过提前解析域名、预测用户可能的访问和建立预连接以及预获取资源等方式,减少DNS解析的延迟时间和连接建立时间,从而加快网页加载速度:

  • 预解析其他资源的域名:用户访问一个网页的主页时,浏览器会预解析其他页面上的链接,当用户点击链接时,浏览器已经知道对应的IP地址,从而加快加载速度;

  • 预连接:通过使用下面的标签使浏览器尝试与指定域名建立连接,以便在实际需要请求资源之前就建立好连接,减少建立连接的延迟时间;

    <link rel="preconnect" href="url">
    
  • 预获取:通过使用下面的标签使浏览器在后台预取指定的资源,从而提前加载资源,加快后续页面的加载速度;

    <link rel="prefetch" href="url">
    

域名

  1. 域名发散

    通常,浏览器在请求资源时,会对每个域名同时进行的并发请求数量有限制;域名发散通过将页面内容或资源分散在多个子域名上,浏览器可以多线程下载资源从而提高页面加载速度;但是域名发散会导致额外的DNS解析开销和连接建立开销。

  2. 域名收敛

    与域名发散相反,域名收敛尽可能减少使用多个子域名,将所有资源集中在一个主域名上加载,主要是为了减少DNS解析和连接建立的开销。

两者需要通过权衡域名数量、并发连接数限制之间和加载性能之间的关系。

压缩

gzip和brotil都被用于优化传输过程中的数据大小,从而减少传输时间和网络资源的消耗。两者通过使用不同的压缩算法和技术减少传输的数据量,通常,brotil相比于gzip在压缩率上表现得更好,但在实际使用中需要考虑到服务器支持、客户端兼容以及数据类型等因素。

稳定性

重试机制

当客户端向服务器发送请求或数据时,若服务器未能正确处理请求,客户端会判断无法响应请求的原因并采取相应措施进行重试:

  1. 定义重试次数:客户端可以事先定义重试次数,以确保在失败的情况下多次尝试重新发送数据或请求;
  2. 设置重试间隔:在每次重试之间设置时间间隔,避免过于频繁地发送请求,同时给服务器一些时间来处理之前的请求或恢复;
  3. 指数退避:每次失败后,将重试间隔逐渐增加,以避免同时发起大量请求对服务器造成更大负担;
  4. 状态码判断:客户端通常会根据服务器返回的状态码来判断请求是否成功。如果返回的状态码表明请求失败,客户端会触发重试机制;
  5. 超时设置:在发起请求时,客户端通常会设置一个超时时间,如果在该时间内没有得到响应,就会触发重试机制;
  6. 限制重试次数:为了避免无限制的重试,客户端可以设置一个最大重试次数,超过这个次数后不再进行重试,并通知用户或记录日志。

缓存

通过将一部分经常请求的数据或资源缓存到本地或边缘节点,一方面可以减轻服务器和数据库的负载,提高响应速度,降低系统崩溃的风险;另一方面可以在网络故障或服务器宕机时提供一定程度的容错能力,即当后端服务器不可用时,浏览器仍可以从缓存中获取数据。