我正在阅读Alex Maccaw的post,他说:
最后一个问题是并行发送的Ajax请求。如果用户创建记录,然后立即更新同一记录,则会同时发送两个Ajax请求, POST 和PUT。但是,如果服务器在“创建”之前处理“更新”请求,它就会吓坏。它不知道哪条记录需要更新,因为尚未创建记录。
解决方案是管道Ajax请求,以串行方式传输它们。 Spine默认执行此操作,排队 POST ,PUT和DELETE Ajax请求,以便一次发送一个。只有在前一个请求成功返回后才会发送下一个请求。
但HTTP规范Sec 8.1.2.2 Pipelining 说:
客户端不应使用非幂等方法或非幂等方法序列来管道请求(请参阅第9.1.2节)。否则,提前终止传输连接可能会导致不确定的结果。
那么,Spine真的'管道'POST了吗?
答案 0 :(得分:3)
Maccaw对术语“管道传输”的使用以及HTTP规范的使用在这里并不相同。实际上,他们正好相反。
在HTTP规范中,术语“流水线”意味着在不等待响应的情况下发送多个请求。 See section 8.1.2.2
支持持久连接的客户端可以“管道化”它 请求(即,发送多个请求而不等待每个请求 响应)。
基于此定义,您可以看到为什么规范会强烈阻止管道化非幂等请求,因为其中一个流水线请求可能会更改应用程序的状态,并产生意外结果。
当Maccaw写关于脊椎的“流水线”时,他实际上是指 解决方案 ,因为客户端将“管道化”请求而无需等待响应,如根据HTTP规范。也就是说,spinejs会对请求进行排队并按顺序提交请求,每个连续请求只有在其前任完成后才会生成。