inq*_*One 7 ajax asynchronous web-applications http
"服务器必须按照收到请求的相同顺序发送对请求的响应".
所以,我想,如果我从浏览器发出多个AJAX请求,它们仍将按照服务器接收它们的顺序进行处理.
但后来,我正在阅读Alex Maccaw的这篇文章,他说:
"最后一个问题是与并行发送的Ajax请求.如果用户创建记录,然后立即更新同一记录,将同时发送两个Ajax请求,一个POST和一个PUT.但是,如果服务器在"创建"之前处理"更新"请求,它就会吓坏.它不知道哪条记录需要更新,因为还没有创建记录.
解决方案是管道Ajax请求,并以串行方式传输它们.Spine默认执行此操作,排队POST,PUT和DELETE Ajax请求,以便一次发送一个.只有在前一个请求成功返回后才发送下一个请求."
那么,我如何以编程方式创建Alex Maccaw提到的场景?
我想简而言之,你的问题的答案是肯定的.
HTTP 1.1不禁止打开到同一服务器的多个TCP连接(实际上它建议使用两个),并且所有现代浏览器都这样做(实际上,大多数都是六个或更多).在浏览器中查看Max并行http连接?.由于各种原因,可以在每个连接上进行请求 - 响应循环,并且一些请求 - 响应循环可以比其他循环快得多.网络拥塞,请求的复杂性,处理请求的特定"工作者"的速度和负载等.这意味着稍后启动的请求的请求 - 响应周期可能比请求开始的周期更快地完成早.
"服务器必须按照收到请求的相同顺序发送对请求的响应".
此声明仅适用于流水线化多个http请求,即通过一个TCP连接发送多个请求,而无需等待每个请求的响应.它不适用于打开到同一服务器的多个TCP连接.
通常,每个tcp连接只有一个请求同时进行.客户端等待响应,当它得到响应时,可能会重新使用连接来获取新请求.因此,就常规(非流水线)http而言,甚至没有"响应顺序"的概念,因为在TCP连接上只有一个请求 - 响应周期.
使用流水线操作,在一个TCP连接上触发多个http请求.重要的是按顺序恢复响应,因为这是响应与其原始请求匹配的方式.(匹配对请求的响应可能是以不同的方式完成的,例如通过在每个响应上提供完整请求的哈希值,但这不是重点).
此外,很高兴知道HTTP流水线的(默认)支持并不广泛.Chromium项目不愿意启用它:https://insouciant.org/tech/status-of-http-pipelining-in-chromium/.Firefox仍然没有启用它.https://bugzilla.mozilla.org/show_bug.cgi?id=264354
另一方面,Apple在IOS5上的safari中支持它,可能是因为移动设备上的请求 - 响应延迟是一个更大的问题.http://www.guypo.com/mobile/ios5-top10-performance-changes/ Android股票浏览器也是如此.至少是Chrome之前的版本.http://www.guypo.com/mobile/http-pipelining-big-in-mobile/
Alex Maccaw在关于Spine的帖子中写道:
解决方案是管道Ajax请求,并以串行方式传输它们.
我认为管道这个术语在这种情况下有点令人困惑.首先,Spine所做的"流水线操作"与在HTTP中流水线请求的可能性完全不同.其次,我想我称之为Spine请求排队的这个特殊功能.Spine对请求进行排队,并按照添加顺序处理队列中的项目.
一般来说,我认为术语"流水线"最适合用于有目的地更快地制作物品,而"排队"最好用于使物品有目的地变慢(防止竞争条件,或减轻排队物品的处理器上的负荷) , 例如).
| 归档时间: | 
 | 
| 查看次数: | 5747 次 | 
| 最近记录: |