我似乎在文档中看不到明显的答案。
当我在 S3 上更新文件并启用 CloudFront 时,S3 是否会向 CloudFront 发送失效信号?还是我需要在更新文件后自己发送?
我似乎在文档中看不到明显的答案。
当我在 S3 上更新文件并启用 CloudFront 时,S3 是否会向 CloudFront 发送失效信号?还是我需要在更新文件后自己发送?
S3 不会向 CloudFront 发送任何失效信息。默认情况下,CloudFront 将在从源检索数据时设置的缓存控制标头指定的最长时间内保存信息(如果愿意,它可能会提前从缓存中删除项目)。
您可以通过创建失效批处理来使缓存条目失效。这将花费您的钱:每月的第 1000 个请求是免费的,但除此之外,每个请求的费用为 0.005 美元 - 如果您每天使 1000 个文件无效,则每月将花费您 150 美元(除非您可以使用通配符功能)。您当然可以使用 Amazon Lambda 函数触发此事件以响应 s3 事件。
另一种方法是在对象更改时使用不同的路径(实际上是分代缓存键)。同样,您可以将查询参数附加到 url 并在您希望 cloudfront 获取新副本时更改该查询参数(为此,您需要告诉 CloudFront 使用查询字符串参数 - 默认情况下它会忽略它们)。
如果您只进行不频繁(但大)的更改,另一种方法是简单地创建一个新的云端分发。
据我所知,所有的 CDN 都是这样工作的。
这就是为什么您通常使用诸如foo-x.y.z.ext
在 CDN 上对资产进行版本控制的原因。我不会使用foo.ext?x.y.z
,因为某些浏览器和代理从不使用?QUERY_STRING
.
一般来说,你可能想看看这个: https ://developers.google.com/speed/docs/best-practices/caching
它包含许多最佳实践,并详细介绍了要做什么以及它是如何工作的。
关于 S3 和 Cloudfront,我对缓存失效不是很熟悉,但 Frederick Cheung 提到的都是正确的。
一些提供商还允许您直接清除缓存,但由于 CDN 的性质,这些更改几乎不会立即发生。另一种方法是设置较小的 TTL(过期标头),以便更频繁地刷新资产。但我认为这也违背了 CDN 的目的。
在我们的案例(Edgecast)中,缓存失效是可能的(手动过程)并且是免费的,但我们很少这样做,因为我们会相应地对资产进行版本控制。