我不太理解当多个请求同时发送(在收到响应之前)时,HTTP是如何工作的。有两种情况:
1)使用“Connection:Keep-Alive”。
根据HTTP规范:
客户端支持持久连接的话可以“管线化”其请求(即,发送多个请求而无需等待每个响应)。服务器必须按照接收到请求的相同顺序发送其响应。
这种方式似乎很难实现和维护。服务器必须跟踪请求的顺序并以正确的顺序响应。不仅可能难以实现,而且会有性能损失:如果稍后发出的请求比较慢,则快速请求必须等待处理完慢速请求后才能得到响应。
如果我们在谈论负载均衡器,那么代理必须跟踪哪个请求被发送到了哪个服务器,以便在它们返回时将它们放入队列并按顺序响应。那么为什么不一开始就这样做呢?也就是说,客户端放置(例如)
所以问题是:为什么要以指定的方式指定流水线处理?
2)没有
我找不到关于这种情况的任何信息。假设客户端发出两个请求A和B。没有保持活动连接,服务器将在处理请求后关闭连接。这显然会引入竞争条件。那么它应该如何行事?应该放弃第二个请求吗?
1)使用“Connection:Keep-Alive”。
根据HTTP规范:
客户端支持持久连接的话可以“管线化”其请求(即,发送多个请求而无需等待每个响应)。服务器必须按照接收到请求的相同顺序发送其响应。
这种方式似乎很难实现和维护。服务器必须跟踪请求的顺序并以正确的顺序响应。不仅可能难以实现,而且会有性能损失:如果稍后发出的请求比较慢,则快速请求必须等待处理完慢速请求后才能得到响应。
如果我们在谈论负载均衡器,那么代理必须跟踪哪个请求被发送到了哪个服务器,以便在它们返回时将它们放入队列并按顺序响应。那么为什么不一开始就这样做呢?也就是说,客户端放置(例如)
ID
头,服务器处理请求并用相同的ID
头响应,以便客户端可以将请求与响应匹配。这样实现起来更容易,而且不会引入请求排队问题(如果有必要,由客户端跟踪请求顺序)。所以问题是:为什么要以指定的方式指定流水线处理?
2)没有
Connection: Keep-Alive
。我找不到关于这种情况的任何信息。假设客户端发出两个请求A和B。没有保持活动连接,服务器将在处理请求后关闭连接。这显然会引入竞争条件。那么它应该如何行事?应该放弃第二个请求吗?