【问题标题】:Batching requests over HTTP2通过 HTTP2 批处理请求
【发布时间】:2020-06-03 08:30:59
【问题描述】:

如果我们发出一个较大的 HTTP 请求,而不是通过 HTTP2 发出多个较小的 HTTP 请求,是否有可能从我们的服务器获得更好的吞吐量。

据我了解,它不应该在性能上产生任何显着差异,因为使用 HTTP2 我们可以通过一个 TCP 连接多路复用多个请求。

【问题讨论】:

    标签: performance http tcp http2


    【解决方案1】:

    是的,在网络级别,一个大请求将比多个小请求更有效。这是由于发出网络请求的开销造成的。

    这也是为什么在 HTTP/1.1 下建议将 CSS 和 JavaScript 连接起来并为图像绘制精灵,这样发送的数据量是相同的,但请求的数量要少得多。事实上,由于 gzip 等压缩的工作方式,发送大请求时数据量通常较小。

    HTTP/2 旨在通过使用multiplexing 重用单个 TCP 连接来大大降低 HTTP 请求的成本。从理论上讲,这将允许我们放弃串联和拆分。然而,现实并不完美——通常是由于浏览器效率低下而不是 HTTP/2 的错误。瓶颈刚刚转移,我们需要针对新世界优化浏览器。所以,就目前而言,仍然建议使用某种程度的 connation 和 spriting。

    回到您的问题,是的,它应该在该网络级别具有单一效果,事实上,如果您这样做,HTTP/1.1 和 HTTP/2 甚至可能在性能上相似。

    但是,在网络级别之外,您可能会发现其他不将文件打包成更少文件的原因。例如,如果您有一个较大的 JavaScript 文件,那么浏览器必须等待它全部下载完毕,然后才能对其进行解析、编译和运行。最好先下载更小、更重要的 JavaScript。与图像精灵类似,您可能会在显示单个图像之前等待整个精灵文件下载。

    然后是缓存的含义。更改单行 JS 或将单个图像添加到图像 Sprite 需要创建一个全新的大文件,这意味着旧的无法使用,需要重新完整下载整个文件。

    另外,拥有大文件可能更难以实现和管理。它们需要一个构建步骤(可能不像许多网站那样重要),并且通过 CSS 创建和管理图像精灵通常更加困难。

    此外,如果使用它来坚持 HTTP/1.1,那么您可能会错过 HTTP/2 的其他好处,包括 HPACK header compression 和 HTTP/2 推送(尽管这也是 more tricky to get right,而不是最初的想法/希望!)。

    It’s a fascinating topic that I’ve spent a lot of time on,最好的建议(一如既往!)是了解技术并测试、测试、测试!

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 2018-08-10
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2015-09-25
      • 1970-01-01
      • 2020-11-09
      相关资源
      最近更新 更多