3

几个月前为存储桶激活了 Cloud CDN。我们的存储数据通过后端定期更改。因此,为了使缓存版本无效,我们向changedDate提供给客户端的 url 添加了一个查询参数。

当时这运作良好。

在过去几个月(可能是几周)的某个时候,Google 似乎改变了这一点,现在忽略了从存储桶缓存的查询字符串。

  • 第一部分:有谁知道为什么会发生这种变化以及为什么没有人收到通知?
  • 第二部分:如何使存储桶中特定对象的缓存失效,而无需每次都发送缓存失效请求(您不应该这样做)?

我不喜欢每次上传某些内容时删除旧文件并上传更改文件名的新文件的想法......

编辑:澄清:官方文档( cloud.google.com/cdn/docs/caching )已经声明他们现在忽略存储桶的查询字符串:

对于后端存储桶,缓存键由不带查询 > 字符串的 URI 组成。因此https://example.com/images/cat.jpghttps://example.com/images/cat.jpg?user=user1https://example.com/images/cat.jpg?user= user2是等价的。

4

3 回答 3

3

我们也受此影响。联系 Google 支持后,他们已确认这是一项永久性更改。建议的解决方法是在对象名称中使用版本控制,或者使用缓存失效。后者听起来有点奇怪,因为缓存失效文档指出:

失效旨在用于特殊情况,而不是作为正常工作流程的一部分。

于 2019-03-29T11:40:22.017 回答
0

如官方文档所述,对于后端存储桶,缓存键由不带查询字符串的 URI 组成。1存储桶未评估查询字符串,但 CDN 仍应执行此操作。我可以重现同样的场景,并且目前仍然可以使用查询字符串作为缓存破坏器。

似乎更改的原因是旧行为导致丢失缓存机会、更高的成本和更高的延迟。目前唯一推荐的解决方法是通过将版本合并到对象名称中来创建新对象(这对于您的情况似乎不是有效的选项),或者使用缓存失效。

使特定对象的缓存无效将需要使用特定查询。也许允许此类对象缓存一段时间的 Cache-Control 标头可能是您的解决方法。Cloud CDN 缓存的过期时间由“Cache-Control: s-maxage”、“Cache-Control: max-age”和/或 Expires headers 2定义。


于 2019-03-27T10:30:03.403 回答
0

根据文档,当使用后端存储桶作为 Cloud CDN 的来源时,请求 URL 中的查询字符串不包含在缓存键中:

对于后端存储桶,缓存键由不带协议、主机或查询字符串的 URI 组成。

也许使用查询字符串来识别不同版本的缓存内容并不是GCP 提倡的最佳实践。但对于一些遗留问题,它必须是。

因此,解决此问题的一种方法是将后端存储桶设为静态网站(此处不要启用 CDN),然后使用指向该静态网站的自定义来源(由Internet 网络端点组后端服务支持的云 CDN )。

对于后端服务,查询字符串是缓存键的一部分。

对于后端服务,Cloud CDN 默认使用完整的请求 URI 作为缓存键

而已。是的,这很乏味但有效!

于 2020-06-22T08:03:43.980 回答