动静不分离

过去网站初创时期会将静态资源和后端服务部署在一起。静态资源和用户访问量比较少时,这种做法的确可以减少维护成本并提高效率。

动静不分离对于服务器单机并发是一个考验。当网站静态资源和用户访问量急剧增多,网站打开速度开始下降时,静态资源对于后端服务的拖累也开始明显起来。

动静分离

因为用户所处地域不同,单地域或单机部署无法保证所有用户访问网站的速度。这时候我们需要使用分布式部署来解决这些性能问题,然而动静不分离会给分布式部署制造障碍,毕竟每次部署后端服务的时候都需要对静态资源都部署一遍显然是不合理的。

随着 CDN 行业的兴起,越来越多的公司会在动静分离时直接使用 CDN 部署静态资源。例如网站服务使用 www.abc.com 这个域名,静态资源使用 staic.abc.com 这个二级域名并将其解析到 CDN 上。

这是一种跨时代的进步,静态资源和后端服务不再互相挤占服务器并发。我们要讨论的内容也必须基于动静分离这个大前提。

二级域名部署

上述使用二级域名部署的方式将静态资源部署在 CDN 上的方式不会占用后端服务器的并发,然而如果同一个页面使用到的静态资源过多,浏览器请求这些资源消耗的时间也会非常影响网站打开时间。

毕竟作为一个有良知的客户端,浏览器通过限制单域名的并发请求数量来保护服务器。如果浏览器将页面的所有请求同时发出可能会直接导致服务器的瘫痪。这点和以太网的冲突检测机制很像,客户端在使用公共资源时必须自己设立一个等待期。因为当多个客户端同时访问一个资源时,相对强势的那个客户端可能会导致弱势的客户端完全没有办法访问到资源。限制单域名并发数的做法反过来又可以保证所有客户端的体验大致相当,这也算是一种将心比心的做法了吧。

目前浏览器对于单域名的并发数一直没有一个行业标准,不同厂商的浏览器基本限制都在10个左右,具体细节可以参考这里

因此,如果网站首页需要请求50个静态资源,那么理想的情况我们应该把这些资源分别部署在2-4个不同的二级域名下面。为什么部署静态资源的域名不是越多越好呢?因为过多的域名散布会导致浏览器在 DNS 解析上付出额外的代价,通常控制在2-4个域名之间是比较合理的选择。

独立域名部署

上面二级域名部署的方式还有什么可以优化的空间么?回答是肯定的。

如果我们将资源部署在二级域名下面,浏览器在请求时会将当前域名下的 Cookie 也一起带过去,然而这些静态资源的请求完全不需要使用到 Cookie 信息。如果 Cookie 大小为1KB,那么50个静态资源就需要消耗50KB带宽,这对于访问量大的网站也是一笔不小开销。因此,我们可以使用一个独立域名的二级域名部署静态资源来避免这种资源浪费。

八云酱
八云酱