使用HTTP管线化的缺点是什么?

54
1个回答

85

实现缺陷

为了使流水线工作,响应必须按照请求的顺序返回。一个天真的服务器实现可能只是在计算出响应后立即发送它。如果多个请求并行发送,并且第一个请求需要更长时间来处理(例如处理较大的图像),那么响应将不按顺序返回。

这对客户端来说是一个问题,因为HTTP是一种无状态协议,客户端无法将请求与响应匹配。它依赖于响应的顺序。

服务器必须以接收到请求的相同顺序发送其响应。

性能问题

即使服务器正确支持流水线技术,性能问题也可能会出现,因为所有后续请求都必须等待第一个请求完成(阻塞头部)。

  • 这篇文章谈到了在某些情况下的性能损失和拒绝服务攻击的潜在风险。

  • 这篇文章 也认为流水线并不是很厉害。

  • WWDC 2015 - 使用 NSURLSession 进行网络请求 很好地解释了阻塞问题。(解决方案是切换到支持优先级的 HTTP 2)

  • 阻塞效应

    因此,HTTP 流水线存在以下问题:

    • 一些服务器和大多数代理不支持它。(可能由于安全性、可靠性或性能问题)
    • 一些服务器错误地支持它,这可能导致客户端出现错误。
    • 它不一定会提高性能。
    • 容易受到阻塞效应的影响。

    你能详细说明为什么代理不支持它(假设代理连接的服务器支持它)吗? - Helin Wang
    2
    @HelinWang - 如果你仔细想一下,代理的实现很困难,因为它必须按正确的顺序发送响应。它们也容易受到头部阻塞的影响(见图表)。维基页面上说:“大多数HTTP代理不会对外部请求进行流水线处理”。https://en.wikipedia.org/wiki/HTTP_pipelining#Implementation_in_web_proxies - Robert
    1
    值得一提的是,HTTP/2 解决了队首阻塞的问题。 - vtortola
    @vtortola 这并不完全正确,它将HOL阻塞移动到了TCP...负担被转移,但并没有消失。 - James Graham

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接