问题起因是大佬问cdn是如何处理head请求的,会缓存还是直接就回源了?
HEAD请求是干嘛的?
Head请求是通常用于获取资源的元数据,例如资源的大小、类型、最后修改时间等。而不获取资源的实际内容。
元数据是指响应的响应头相关信息,例如:
- Content-Type:资源的类型,例如text/html、image/jpeg等
- Content-Length:资源的大小,单位是字节
- Cache-Control:资源的缓存策略
- Last-Modified:资源最后的修改时间
- Expires:资源的过期时间,用于指定资源的缓存过期时间
- ETag:资源的实体标签,用于验证资源是否已更改
这里的实际内容是指响应的body
使用场景
搜索引擎爬虫:发送head请求来获取网页的元数据信息,例如标题、描述、关键字等,以便在搜索结果中展示
健康检查:发送head请求来检查网站是否可用,以及网站的响应时间等。
开发测试:开发测试人员通过发送head请求来检测api的可用性和响应速度等。
和缓不缓存有什么关系?
Head请求我们已经知道是获取资源的元数据。这里的缓存是指cdn把head请求到的元数据缓存一份,下次有get请求进来,会直接用缓存的元数据去响应。这个响应是指,将head请求的元数据和cdn中的缓存的实际资源内容进行组合,然后返回给get请求。这样能提高响应速度并减少网络带宽。
和回不回源有什么关系?
首先,我们得弄清楚啥是回源;cdn有两种方法从源服务器获取资源的实际内容:缓存刷新和回源拉取
缓存刷新
是指cdn从源服务器获取最新的资源内容,并将其存储在缓存中。是一种被动的方式,因为cdn只有在资源过期或被删除的情况下才会从源服务器获取最新的资源内容。就上面的情况来说,当cdn收到get请求时,它会将缓存head请求的元数据作为响应请求的头部,从缓存中获取最新的资源内容作为响应请求的主体。
回源拉取
是指cdn主动从源服务器获取最新的资源内容,并将其缓存下来。这是一种主动的方式,因为cdn可以在任何时候从源服务器获取最新的资源内容,而不必等待缓存中的资源过期或者是被删除。回源拉取能确保缓存的资源内容始终是最新的。但是回源拉取会增加带宽成本和源服务器的负载压力。
也就是说回不回源,第一个方面是涉及到带宽成本的考量。另一个方面就是响应时延的大小。
head缓存有什么弊端?
用head请求的元数据去响应get请求的最大弊端是可能会导致缓存不一致。因为head请求只返回资源的元数据,而不返回实际内容。如果cdn缓存了过时的元数据,而不是最新的资源内容。这可能会让客户端获取到错误的元数据,从而导致应用程序出问题。
目前国内的cdn厂商对于缓不缓存head以及先head请求后get请求的缓存逻辑是不一样的。比如:
- 当缓存为空的时候;先head请求,cdn回源拉取并缓存下来做响应,后有get请求的时候再回源去拿body(实际资源内容),这个时候就会存两份缓存(head、body)。
- 当有head请求缓存;先head请求,直接响应head请求缓存,不关注是否有get请求缓存。
- 当有get请求缓存;先head请求,则直接响应get请求缓存的头部元数据,这时候就只有一份缓存。