网络优化
使用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">
域名
-
域名发散
通常,浏览器在请求资源时,会对每个域名同时进行的并发请求数量有限制;域名发散通过将页面内容或资源分散在多个子域名上,浏览器可以多线程下载资源从而提高页面加载速度;但是域名发散会导致额外的DNS解析开销和连接建立开销。
-
域名收敛
与域名发散相反,域名收敛尽可能减少使用多个子域名,将所有资源集中在一个主域名上加载,主要是为了减少DNS解析和连接建立的开销。
两者需要通过权衡域名数量、并发连接数限制之间和加载性能之间的关系。
压缩
gzip和brotil都被用于优化传输过程中的数据大小,从而减少传输时间和网络资源的消耗。两者通过使用不同的压缩算法和技术减少传输的数据量,通常,brotil相比于gzip在压缩率上表现得更好,但在实际使用中需要考虑到服务器支持、客户端兼容以及数据类型等因素。
稳定性
重试机制
当客户端向服务器发送请求或数据时,若服务器未能正确处理请求,客户端会判断无法响应请求的原因并采取相应措施进行重试:
- 定义重试次数:客户端可以事先定义重试次数,以确保在失败的情况下多次尝试重新发送数据或请求;
- 设置重试间隔:在每次重试之间设置时间间隔,避免过于频繁地发送请求,同时给服务器一些时间来处理之前的请求或恢复;
- 指数退避:每次失败后,将重试间隔逐渐增加,以避免同时发起大量请求对服务器造成更大负担;
- 状态码判断:客户端通常会根据服务器返回的状态码来判断请求是否成功。如果返回的状态码表明请求失败,客户端会触发重试机制;
- 超时设置:在发起请求时,客户端通常会设置一个超时时间,如果在该时间内没有得到响应,就会触发重试机制;
- 限制重试次数:为了避免无限制的重试,客户端可以设置一个最大重试次数,超过这个次数后不再进行重试,并通知用户或记录日志。
缓存
通过将一部分经常请求的数据或资源缓存到本地或边缘节点,一方面可以减轻服务器和数据库的负载,提高响应速度,降低系统崩溃的风险;另一方面可以在网络故障或服务器宕机时提供一定程度的容错能力,即当后端服务器不可用时,浏览器仍可以从缓存中获取数据。