亚马逊云前缀延迟

35
我正在尝试使用AWS S3和CloudFront为我正在开发的Web应用程序做实验。
在应用程序中,我允许用户通过AWS SDK将文件上传到S3存储桶,并通过CloudFront CDN使其可用。 但是问题在于即使文件已经上传并准备就绪在S3存储桶中,它在CloudFront CDN URL上可用需要大约1或2分钟,这种情况是否正常?

这不是CDN的设计初衷。如果您的应用程序在缓存和过期方面容忍度较低,那么最好使用S3,并将CloudFront仅用于静态内容。 - Khalid T.
13
@KhalidT,你对CloudFront工作方式的描述是不正确的。S3中的新文件在创建时不会被传播到每个边缘位置。每个边缘位置将在第一次请求文件时获取文件并将其添加到边缘位置的缓存中。我建议您阅读此页面以了解CloudFront(以及大多数其他CDN)的工作方式:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/HowCloudFrontWorks.html - Mark B
8
你是否尝试在文件上传到S3之前或上传完成之前,就从CloudFront请求该文件?这么做会导致缓存中毒几分钟,因为对象的不存在会被您过早的请求短暂地缓存。CloudFront绝对适用于实时操作,造成你所描述的行为只有一个原因。请检查响应头中的“Age:”字段,它告诉你缓存响应已被缓存了多长时间。 - Michael - sqlbot
1
对的,但我想问你在上传文件之前是否尝试过下载文件,因为如果是这样的话,就会导致你看到的情况。错误响应中是否包含“Age:”头? - Michael - sqlbot
5
这是谷歌浏览器!在我按回车键之前,它会在后台加载页面。我实际上已经输入了网址并等待文件上传完成(在另一个标签页中)。你说得对! - Ahsan
显示剩余3条评论
3个回答

55

CloudFront尝试实时从源服务器获取未缓存的内容。由于CloudFront是一个拉取式CDN,因此不存在“复制延迟”或类似问题。每个CloudFront边缘位置仅知道您网站的存在和配置;在收到请求之前,它不知道您的内容。当发生这种情况时,CloudFront边缘从源服务器获取所请求的内容,并根据需要将其缓存以便为后续请求提供服务。

这里发生的问题与一种称为“负缓存”的概念有关——缓存请求“不会”起作用的事实——通常是为了避免向缓存的任何内容的来源发送可能失败的请求。

默认情况下,当您的源返回HTTP 4xx或5xx状态代码时,CloudFront会将这些错误响应缓存五分钟,然后提交下一个对象请求到您的源,以查看导致错误的问题是否已解决并且所请求的对象现在可用。

— http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html

如果浏览器或其他任何东西在上传到S3之前尝试从特定的CloudFront边缘下载该文件,S3将返回错误,并且CloudFront - 在该边缘位置 - 将缓存该错误并记住在接下来的5分钟内不再尝试。

不用担心,这个计时器是可配置的,所以如果浏览器在您的控制范围之外进行此操作,您仍然应该能够解决它。

您可以为每个CloudFront缓存的4xx和5xx状态代码指定错误缓存持续时间 - 错误缓存最小TTL。有关详细信息,请参见配置错误响应行为

— http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html


在控制台中配置此项:

查看分发配置时,请单击“错误页面”选项卡。
对于每个需要自定义定时的错误,请首先单击“创建自定义错误响应”。
从下拉列表中选择要修改的错误代码,例如403(禁止)或404(未找到)--您的存储桶配置决定S3返回哪个代码用于丢失的对象,因此如果您不确定,请更改403,然后重复该过程并更改404。
将“错误缓存最小TTL(秒)”设置为“0”。
将“自定义错误响应”设置为“否”(如果设置为“是”,则此选项会在错误时启用自定义响应内容,这不是您想要的。激活此选项超出了本问题的范围)。
单击“创建”。这将带您回到以前的视图,在那里您将看到刚刚定义的代码的“错误缓存最小TTL”。
请为每个你想要更改为非默认行为的HTTP响应代码重复这些步骤(即上文所述的300秒保持时间)。
当你完成所有想要的更改后,请返回主CloudFront控制台屏幕,在那里列出了分发。 等待分发状态从 “In Progress” 更改为 “Deployed”(以前,这需要相当长的一段时间,但现在通常需要约5分钟才能将更改推送到所有边缘),然后进行测试。

3
这些新文件是第一次写入S3,还是更新现有文件?对于新对象,S3提供读取后写入一致性,并且考虑到CloudFront的拉模型,您不应该在将新文件写入S3时遇到此问题。如果是这样的话,我建议您向AWS提交工单。
如果这些是现有文件的更新,则需要同时处理S3最终一致性和CloudFront缓存过期。这两者都可能导致此类行为。

这些是新文件。我也很困惑为什么需要一到两分钟才能拉取新鲜的文件,因为当CDN请求一个它不知道的URL时,它应该肯定会查询源文件是否存在。我会像你建议的那样打开一个工单。 - Ahsan

0

根据您的评论,似乎谷歌浏览器影响了您的上传/预览策略:

  1. Chrome正在请求当前没有内容的URL。
  2. 请求被Cloudfront缓存,并提供了无效的响应。
  3. 您将文件上传到S3。
  4. 当预览上传的文件时,Cloudfront会使用缓存的响应回复(步骤2)。
  5. 当Cloudfront缓存过期后,Cloudfront会击中源站点,因此问题不再复现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接