Amazon CloudFront 延迟

Posted

技术标签:

【中文标题】Amazon CloudFront 延迟【英文标题】:Amazon CloudFront Latency 【发布时间】:2016-06-02 17:36:36 【问题描述】:

我正在为我正在开发的 Web 应用程序试验 AWS S3 和 CloudFront。

在应用程序中,我让用户将文件上传到 S3 存储桶(使用 AWS 开发工具包)并通过 CloudFront CDN 使其可用,但问题是即使文件已上传并在 S3 存储桶中准备就绪,它也需要大约CloudFront CDN url 中有 1 或 2 分钟可用,这正常吗?

【问题讨论】:

是的。跨边缘位置传播内容需要几分钟时间 @KhalidT。您对 CloudFront 工作方式的描述不正确。 S3 中的新文件在创建时不会传播到每个边缘位置。在第一次请求文件时,每个边缘位置都会获取一个文件并将其添加到边缘位置的缓存中。我建议您阅读此页面以了解 CloudFront(以及与此相关的大多数其他 CDN)的工作原理:docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… 您是否有可能尝试从 CloudFront 请求文件上传到 S3 之前?还是在上传完成之前?这会使缓存中毒几分钟,因为不存在的对象将被您发出过早的请求而短暂缓存。 CloudFront 绝对适合实时操作,您描述的行为只有一个原因。检查响应标头中的 Age:,它会告诉您缓存的响应已被缓存了多长时间。 对,但我想问的是您是否尝试下载 before 您尝试上传之前,在文件存在之前,因为如果您这样做了,那会导致您看到的.错误响应是否包含Age: 标头? 它的谷歌浏览器! chrome.blogspot.com.au/2012/01/speed-and-security.html 在我按 Enter 之前它会在后台加载它。我实际上输入了 url 并等待文件完成上传(在另一个选项卡上)。你说的太对了! 【参考方案1】:

这些新文件是第一次写入 S3,还是更新到现有文件? S3 为新对象提供写后读一致性,并且鉴于 CloudFront 的拉取模型,您应该不会在将新文件写入 S3 时遇到此问题。如果你是,那么我会向 AWS 开一张票。

如果这些是对现有文件的更新,那么您需要处理 S3 最终一致性和 CloudFront 缓存过期问题。两者都可能导致这种行为。

【讨论】:

这些是新文件。我也很困惑,为什么它需要一到两分钟才能提取新的文件,因为当 CDN 被要求提供一个它不知道的 url 时,它肯定应该查询其存在的来源。我会按照你的建议开一张票。【参考方案2】:

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。流程见Configuring Error Response Behavior。

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


在控制台中进行配置

查看分发配置时,单击Error Pages 选项卡。

对于您要自定义时间的每个错误,首先单击Create Custom Error Response

从下拉列表中选择您要修改的错误代码,例如403(禁止)或404(未找到)——您的存储桶配置决定了 S3 为丢失的对象返回哪个代码,所以如果您不确定,请更改 403,然后重复该过程并更改 404。

Error Caching Minimum TTL (seconds)设置为0

Customize Error Response 设置为No(如果设置为Yes,此选项将启用错误的自定义响应内容,这不是您想要的。激活此选项超出了此问题的范围。 )

单击Create。这将带您回到上一个视图,您将在其中看到您刚刚定义的代码的Error Caching Minimum TTL

对您想要从默认行为(即 300 秒保持时间,如上所述)更改的每个 HTTP 响应代码重复这些步骤。

完成所需的所有更改后,返回到列出分配的 CloudFront 主控制台屏幕。等待分发状态从 In Progress 更改为 Deployed(以前,这需要相当长的时间,但现在通常需要大约 5 分钟才能将更改推送到所有边缘)并进行测试。

【讨论】:

【参考方案3】:

正如您在评论中观察到的,谷歌浏览器似乎搞乱了您的上传/预览策略:

    Chrome 正在请求当前没有 内容。 请求被云端缓存,响应无效 您将文件上传到 S3 预览上传的文件时,云端会使用缓存的响应进行回答(第 2 步)。 Cloudfront 缓存过期后,Cloudfront 命中源,问题无法再重现。

【讨论】:

以上是关于Amazon CloudFront 延迟的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 无法通过 Cloudfront 上传文件

为啥需要 Amazon S3 和 Cloudfront?

Amazon S3 Cloudfront 部署最佳实践

使用 Amazon S3 和 Cloudfront 的 CORS

Amazon Cloudfront 缓存问题

如何为 Amazon CloudFront 签署 RTMP URL