传输过程如何考虑
客户端请求到达服务端后,我们需要保证:网页内容在网络上尽可能快的传递,这可以从两个方面考虑:1.从站点本身来考虑,2.从网络传输的过程考虑,前者是我们确确实实可以控制的,后者就不一定了,不同的用户网络配置、带宽不一样,所以每次在传递内容的时候,要尽可能的压缩,这也是最主要的建议,不过压缩是需要消耗CPU的,CPU的重要性相信大家都明白。
所以,好的站点,不是花钱砸出来的,而是“算计”出来的,从网络传输的过程考虑可以把一些改动比较不多的页面,并且没有用户特性的(不需要登录,验证就能看的)缓存在代理,这样用户请求这些页面时候,就可以直接从代理获取数据,减少对服务端的请求。
服务端配置考虑
服务端相关设计、配置,包括软件和硬件两个大的方面,首先说说服务端的第一个重要的软件-网站宿主或者说apache或者IIS、还有ngix等等,因为很多时候,宿主的配置也很重要,由于汪洋主要是从事的是Windows平台相关架构工作,所以重点介绍了IIS。
▲IIS处理流程
下面通过模拟一个请求,了解IIS是如何工作的,从这个图中,我们可以很清楚的看到请求是如何最后被IIS请求,然后响应发送到客户端的:1. 当请求到达服务器,首先进入内核模式,由内核组件http.sys接受,在这里,会进行验证Url是否合法等,另外根据请求Url,去内核缓存中,检测是否有对应的响应,2.如果有,直接返回;否则,进行一次用内核模式到用户模式的切换,将请求交给IIS的监听线程,IIS监听线程依然去检测IIS的缓存,如果没有,在进行线程切换,将请求给ASP.NET出来线程,后面的以此类推。
那么,在得到一个响应的过程中,可能会涉及到三次的线程切换,还有两次的模式切换,虽然在IIS7 7.5中,改进了这个过程,但是这其中代价依旧很大,最好的方式就是数据均保存在内核缓存中,然而这时又不得不面临另一个问题,大量数据存放于缓存中对性能的影响非常大,这时可以在IIS中设置一些缓存的条件,在默认的情况下,静态文件,例如html,图片,js,css是缓存在IIS内核中的,但是动态的页面和内容,是不在缓存中的,我们可以通过设置,让IIS缓存动态的内容,只不过缓存的时间短一些而已,站点的内容不可能时时刻刻更新,总有一段所谓的“数据静态时间(数据不变)”,几秒也行。
至于如何设置缓存,主要就是修改IIS中的配置文件,很简单,这里不赘述,至于缓存,这就是关键了,IIS缓存有限,要分析哪些页面是访问量最大的,把这几个页面置于缓存中;另外,就是压缩的问题了,在数据传输之前,IIS可以控制压缩,在IIS中 压缩分为9个级别,级别越高,压缩的就越厉害,但是消耗的CPU也就越厉害,这其中就需要折中,我们会发现,整个网站的架构中,很多方面都需要折中。
▲IIS组件安装-动态内容压缩
▲通过命令行 设置IIS的压缩级别
另外可以考虑定制IIS,开发IIS中间件,具体要考虑有没有这个必要了。