是否有必要在 HTTP/2 中缓存半身像?
Is it necessary to cache bust in HTTP/2?
在HTTP/1中,为了避免额外的网络请求决定资源是否应该保持缓存,我们会在静态资产上设置一个高max-age
或Expires
值,并给它们每个修订版都有一个唯一的 URL。但是在 HTTP/2 中,请求很便宜,所以我们可以不使用缓存破坏,而只依赖 ETags、last-modified 等吗?
我认为继续破坏缓存(除了双重服务 HTTP/1 和 HTTP/2 客户端之外)的唯一优势是节省带宽检查资源是否过时。甚至这对于 HPACK 来说也可能无关紧要。那么我是不是遗漏了什么,或者我现在可以停止缓存清除吗?
"necessary" 部分取决于您对性能的感受。简而言之,如果您可以忍受三到四次往返,则不需要缓存破坏。否则缓存破坏仍然是删除这些的唯一方法。
这里有一些关于HTTP/2 vs HTTP/1.1 的争论,延迟问题,以及HTTP/2 Push 的使用。
HTTP/2 请求不是即时的
HTTP/2 请求比 HTTP/1.1 便宜,但不会太多。在 HTTP/1.1 中,一旦浏览器打开到服务器的六到八个 TCP 连接,它就有六到八个通道进行重新验证。在一些高 TCP 丢包、高延迟的场景中,尤其是在 TCP 慢启动为王的连接开始时,HTTP/1.1 的许多 TCP 套接字比单个 HTTP/2 TCP 连接工作得更好. HTTP/2 很好,但不是灵丹妙药。
HTTP/2 连接仍有网络延迟。我们一直在计算网站访问者的平均往返时间 (RTT) (It can be measured using HTTP/2 Ping),因为并非每个人都与我们的服务器位于同一块中,所以我们的平均 RTT 在 200 到 280 毫秒之间。 304 重新验证将花费 1 RTT。在不使用资产串联的站点中,资产树的每个新级别都将花费更多的 RTT。
HTTP/2 推送可以为您节省尽可能多的 RTT,同时还能很好地使用缓存。但是有一些问题,请继续阅读!
HTTP/2 推送最适合缓存清除
理想的情况是服务器不推送新资源,而是推送自客户端上次访问以来发生的所有更改。
如果浏览器认为资源是新鲜的(例如因为 max-age
),它会拒绝或不对该资源使用任何推送。这使得无法使用 HTTP/2 Push.
刷新浏览器认为新鲜的资产
由于浏览器中普遍存在的错误,推送 304 重新验证无效。这些将需要一个小 max-age
。
因此,将 RTT 保持在最低限度、不推送浏览器已有的任何内容并仍然能够推送新版本资产的唯一方法是使用缓存清除,即新名称或查询新版本资产的参数。
另见
Url query parameters are still needed to update assets at clients
在HTTP/1中,为了避免额外的网络请求决定资源是否应该保持缓存,我们会在静态资产上设置一个高max-age
或Expires
值,并给它们每个修订版都有一个唯一的 URL。但是在 HTTP/2 中,请求很便宜,所以我们可以不使用缓存破坏,而只依赖 ETags、last-modified 等吗?
我认为继续破坏缓存(除了双重服务 HTTP/1 和 HTTP/2 客户端之外)的唯一优势是节省带宽检查资源是否过时。甚至这对于 HPACK 来说也可能无关紧要。那么我是不是遗漏了什么,或者我现在可以停止缓存清除吗?
"necessary" 部分取决于您对性能的感受。简而言之,如果您可以忍受三到四次往返,则不需要缓存破坏。否则缓存破坏仍然是删除这些的唯一方法。
这里有一些关于HTTP/2 vs HTTP/1.1 的争论,延迟问题,以及HTTP/2 Push 的使用。
HTTP/2 请求不是即时的
HTTP/2 请求比 HTTP/1.1 便宜,但不会太多。在 HTTP/1.1 中,一旦浏览器打开到服务器的六到八个 TCP 连接,它就有六到八个通道进行重新验证。在一些高 TCP 丢包、高延迟的场景中,尤其是在 TCP 慢启动为王的连接开始时,HTTP/1.1 的许多 TCP 套接字比单个 HTTP/2 TCP 连接工作得更好. HTTP/2 很好,但不是灵丹妙药。
HTTP/2 连接仍有网络延迟。我们一直在计算网站访问者的平均往返时间 (RTT) (It can be measured using HTTP/2 Ping),因为并非每个人都与我们的服务器位于同一块中,所以我们的平均 RTT 在 200 到 280 毫秒之间。 304 重新验证将花费 1 RTT。在不使用资产串联的站点中,资产树的每个新级别都将花费更多的 RTT。
HTTP/2 推送可以为您节省尽可能多的 RTT,同时还能很好地使用缓存。但是有一些问题,请继续阅读!
HTTP/2 推送最适合缓存清除
理想的情况是服务器不推送新资源,而是推送自客户端上次访问以来发生的所有更改。
如果浏览器认为资源是新鲜的(例如因为
max-age
),它会拒绝或不对该资源使用任何推送。这使得无法使用 HTTP/2 Push. 刷新浏览器认为新鲜的资产
由于浏览器中普遍存在的错误,推送 304 重新验证无效。这些将需要一个小
max-age
。
因此,将 RTT 保持在最低限度、不推送浏览器已有的任何内容并仍然能够推送新版本资产的唯一方法是使用缓存清除,即新名称或查询新版本资产的参数。
另见
Url query parameters are still needed to update assets at clients