ajax大并发问题

今天在对项目做性能分析时发现,js代码中同时发出的多个异步请求耗时很长,查看服务器处理 时间发现,每个请求的响应都在毫秒级,
但是页面请求的响应时间却在1秒左右,百思不得其解,后来仔细测试发现,这个并发的ajax请求虽然是同时进入的服 务器,但是各
自的处理时间却存在彼此等待的情况,每个请求的时间处理时间都为几毫秒,但是却在等待上一个请求的结束才开始处理, 
后来查资料发现以下tips:

xmlhttp存在最大并发数,ajax设计应有所斟酌

这次认真的测试了三种浏览器(ie/firefox/opera)的xmlhttp并发行为,发现如果用户同时发出很多xmlhttp 异步请求,那么浏览器不是一股脑全把请求发出去,而是存在一个最大并发数。我的机器测试发现,ie和ff里面是2,opera是4。

所以说,在设计一个站点时,让ajax页面同时载入数十个xmlhttp请求不是明智的做法。在考虑减少接口耦合的同时,也应该斟酌速度问题。实际上,可以使用某些细化的设计,可以把多种请求绑定到一起发送,从而达到优化的目的。

Ajax并发 
  Ajax是以异步的方式向服务器提交需求,这就会存在多个ajax请求同时提交,或者迭代提交的情况,这将导致资源竞争(racing),设计较好的 情况下,可以通过disable提交按钮的缓解此类问题,但一旦出现迭代提交request的情况,就可能出现XMLHttpRequest对象的引用被 覆盖,但具体会发生什么样的情况,取决于Ajax的编码。 
   Ajax在异步的情况下,并发数并非没有限制,Wininet 会限制每个服务器的连接数,限制它对单个 HTTP 服务器的同时连接的数量。
如果超过此限制时,请求将阻止,直到完成当前的连接之一。这是设计使然,是与 HTTP 规范和行业标准。例如IE8并发数就限制在2,Firefox 
21限制在6。当然IE的限制可以在注册表中修改,HKEY_LOCAL_MACHINESOFTWARE  MicrosoftInternet ExplorerMAINFeatureControlFEATURE_MAXCONNECTIONSPERSERVER。   

ersion HTTP 1.0 server (broadband connection) HTTP 1.1 server (broadband connection) HTTP 1.0 server (dial-up 
connection)
HTTP 1.1 server (dial-up 
connection)
Internet Explorer 7 and earlier 4 2 4 2
Internet Explorer 8 6 6 4 2


  

  超出上述限制,超出的请求将会被浏览器阻塞,直到先前的请求已经完成才会启动。在这里建立使用队列来解决这些问题。基本思路,生成XHR对象之后,检 测当前并发数量是否大于最大请求的上限,若大于上限,则将XHR对象压入队列之中,否则就可以直接发送,并且可以继续增加并发请求数量。请求完成的时候, 进行响应处理,并在结束之时进行并发数量减一操作,接着就可以检测队列中是否有等待请求,若有等待请求,就发送给队首的XHR对象进行请求。

原文地址:https://www.cnblogs.com/ziyoublog/p/9449453.html