0

我正在阅读 Alex Maccaw 的这篇文章,他说:

最后一个问题是并行发送的 Ajax 请求。如果用户创建一条记录,然后立即更新同一条记录,则会同时发出两个 Ajax 请求,一个POST和一个 PUT。但是,如果服务器在“创建”请求之前处理“更新”请求,它就会崩溃。它不知道什么记录需要更新,因为该记录尚未创建。

对此的解决方案是将 Ajax 请求流水线化,以串行方式传输它们。Spine 默认执行此操作,将POST 、 PUT 和 DELETE Ajax 请求排队,以便一次发送一个。只有在前一个请求成功返回后才发送下一个请求。

但是 HTTP 规范Sec 8.1.2.2 Pipelining说:

客户端不应使用非幂等方法或非幂等方法序列对请求进行管道传输(参见第 9.1.2 节)。否则,传输连接的过早终止可能会导致不确定的结果。

那么,Spine 真的是“管道”POST 吗?

4

1 回答 1

3

Maccaw 对术语“流水线”的使用和 HTTP 规范的使用在这里并不相同。实际上,它们是相反的。

在 HTTP 规范中,术语“流水线”是指发送多个请求而不等待响应。 请参阅第 8.1.2.2 节

支持持久连接的客户端可以“管道”其请求(即,发送多个请求而不等待每个响应)。

根据这个定义,您可以看到为什么规范强烈反对管道化非幂等请求,因为管道化请求之一可能会改变应用程序的状态,从而产生意想不到的结果。

当 Maccaw 写到 spin 的“流水线”时,他实际上指的是客户端将根据 HTTP 规范“流水线”请求而不等待响应这一事实的解决方案。也就是说,spinejs 会将请求排队并按顺序提交,每个连续的请求仅在其前任完成后发出。

于 2013-04-30T00:21:40.310 回答