gpt4 book ai didi

ajax - 是否可以使用 HTTP 接收乱序响应?

转载 作者:可可西里 更新时间:2023-11-01 15:13:05 29 4
gpt4 key购买 nike

Sec 8.1.2.2 Pipelining说:

"A server MUST send its responses to requests in the same order that the requests were received".

所以,我想,如果我从浏览器发出多个 AJAX 请求,它们仍会按照服务器接收它们的顺序进行处理。

但后来,我正在读这个post来自 Alex Maccaw,他说:

"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 提到的场景?

最佳答案

我认为简而言之,您的问题的答案是"is"。

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 连接上只有一个请求-响应周期。

通过流水线,多个 http 请求在一个 TCP 连接上被触发。按顺序返回响应很重要,因为这是响应与其原始请求匹配的方式。 (对请求的匹配响应可以以不同的方式完成,例如通过在每个响应上提供完整请求的哈希值,但这不是重点)。

此外,很高兴知道(默认)对 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 对请求进行排队,并按照添加的顺序处理队列中的项目。

一般来说,我认为术语“流水线”最适用于有目的地使事情变得更快的情况,而“排队”最适用于有目的地使事情变得更慢的情况(以防止竞争条件,或减轻处理器的负载)例如,排队的项目)。

关于ajax - 是否可以使用 HTTP 接收乱序响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288102/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com