“A server MUST send its responses to requests in the same order that the requests
were received”.
所以,我想,如果我从浏览器发出多个AJAX请求,它们仍将按照服务器接收它们的顺序进行处理.
但后来,我正在阅读Alex Maccaw的post,他说:
“The last issue is with Ajax requests that get sent out in parallel. If a user creates
a record,and then immediately updates the same record,two Ajax requests will be sent out
at the same time,a POST and a PUT. However,if the server processes the ‘update’ request
before the ‘create’ one,it’ll freak out. It has no idea what record needs updating,as
the record hasn’t been created yet.The solution to this is to pipeline Ajax requests,transmitting them serially. Spine
does this by default,queuing up POST,PUT and DELETE Ajax requests so they’re sent one
at a time. The next request sent only after the prevIoUs one has returned successfully.”
那么,我如何以编程方式创建Alex Maccaw提到的场景?
解决方法
HTTP 1.1不禁止打开到同一服务器的多个TCP连接(实际上它建议使用两个),并且所有现代浏览器都这样做(实际上,大多数都是六个或更多).见Max parallel http connections in a browser?.由于各种原因,可以在每个连接上进行请求 – 响应循环,并且一些请求 – 响应循环可以比其他循环快得多.网络拥塞,请求的复杂性,处理请求的特定“工作者”的速度和负载等.这意味着稍后启动的请求的请求 – 响应周期可能比请求开始的周期更快地完成早.
“A server MUST send its responses to requests in the same order that the requests
were received”.
此声明仅适用于流水线化多个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的帖子中写道:
The solution to this is to pipeline Ajax requests,transmitting them serially.
我认为管道这个术语在这种情况下有点令人困惑.首先,Spine所做的“流水线操作”与在HTTP中流水线请求的可能性完全不同.其次,我想我称之为Spine请求排队的这个特殊功能. Spine对请求进行排队,并按照添加顺序处理队列中的项目.
一般来说,我认为术语“流水线”最适合用于有目的地更快地制作物品,而“排队”最好用于使物品有目的地变慢(防止竞争条件,或减轻排队物品的处理器上的负荷),例如).