Http1.1要求每个客户端只能维护与服务器间的两个长连接,这两个长连接一般用于网页与图片等资源的并行加载;如果同时使用Ajax请求,则一定是新开的短连接。
这就造成一种情况,当一个页面提交相当多的Ajax请求时,每一个都会使用短连接与服务器通讯。在通讯完成后,连接随即被关闭。如此,会浪费一定的时间在连接上。
不过这并不是很大的问题,要知道这多次短连接是并发的存在,因此耗费在TCP连接上的时间并不是timexN那么多,与重新创建若干个长连接无二;而后者,则要为维护更多的长连接,付出更少的接入客户端的代价。
IE等浏览器会尝试去用Connection:
Keep-Alive消息头,去请求尽可能多的长连接。如此一来,实际上问题的关键就在于,服务器允许多少同一客户端的长连接。
Asp.Net应用程序默认只允许两个,tomcat之类的应用服务器则没有这么多限制。维持很多的长连接,并非应用服务器的长项,实际上的取值还得根据应用环境而定。
IIS/Apache/Nginx等Web服务器,情况则好得多。一般来说,承载数万个长连接并不是什么难事,所需要的只是使用超时,使得长连接的分配变得公平。
因此,当Ajax应用于请求资源(通常存在于Web服务器)时,无需任何顾虑;用于请求数据(来自于应用服务器)时,要看应用服务器的情况:
同时发起一个数据请求,自然最好是使用长连接,鉴于这种请求往往是网页加载完成后进行,实际上可以复用闲置的长连接,实在不行,浏览器也会自动请求一个新的长连接
同时发起若干/很多数据请求,这是不可取的,最好是顺序的请求数据,让前几次请求开启的长连接被复用,又或者将请求打包到一个Servlet使其一次性返回。就数据接口而言,显然前一个方案更合理。
然而最好的做法就是:
从来不在网页加载完成前提交Ajax请求;
在网页加载完成后,图片等资源加载完成前,提交最多一个Ajax请求;如果要突破这种限制,不妨将服务器端每客户端长连接数设为3-5;
在同一个页面内,提交2个以内的Ajax数据请求。