首页 > 解决方案 > 如何优化 AWS S3 存储桶的下载速度?

问题描述

我们将用户特定的可下载文件保存在 N.Virginia 地区的 AWS S3 存储桶上。我们的客户从世界各地的这些存储桶中下载文件。文件大小范围为 1-20 GB。对于较大的文件,非美国地区的客户会面对并抱怨下载速度慢或下载中断。我们如何优化这些下载?

我们正在考虑以下方法:

  1. 加速下载(更高的成本)
  2. 使用具有 S3 源的 CloudFront CDN(由于我们的下载是不同的文件,每个文件只下载一次或两次,CDN 会有所帮助,因为第一次,它只会从美国存储桶中获取数据)
  3. 将 akamai 用作 CDN(与 CloudFront 相同的问题,唯一的问题是我们在组织级别与 akamai 有更好的价格交易)
  4. 根据用户的位置(我们知道下载将在哪里进行),我们可以将文件保存在在该 aws 区域创建的特定存储桶中。

所以,我想要在成本+下载速度方面的建议。哪个可能是进一步探索的更好选择?

标签: amazon-web-servicesamazon-s3cdn

解决方案


由于每个文件只会被下载几次,您不会从 CloudFront 的缓存中受益,因为下载请求都命中同一个 CloudFront 节点并且该节点尚未从其缓存中逐出文件的可能性可能是接近于零,尤其是对于如此大的文件。

另一方面,您可以通过使用 CloudFront 或S3 Transfer Acceleration(后者与第一个没有缓存的情况基本相同)获得其他好处:请求已经在边缘进入 AWS 的网络,因此您可以避免使用拥塞的网络用户的位置到您的 S3 存储桶的位置,这通常是下载缓慢和中断的主要原因。

根据用户位置存储数据也会改善这种情况,尽管 CloudFront 边缘位置通常比下一个具有 S3 的 AWS 区域更靠近用户。不根据用户位置将文件分发到不同 S3 存储桶的另一个原因是管理开销:您需要管理多个 S3 存储桶,将每个文件存储在正确的存储桶中,并将每个用户指向正确的存储桶。虽然可以通过使用S3 复制来简化存储(您可以使用过滤器仅将对象复制到用于此存储桶的特定目标存储桶),为多个客户管理多个端点的开销仍然存在。此外,当您声明您知道客户的位置时,如果客户确实更改了位置并突然想要下载现在存储在世界另一端的对象,会发生什么?你又会遇到同样的问题。

在您的情况下,我可能会选择选项 2 并在 S3 前面设置 CloudFront。我更喜欢 CloudFront 而不是 S3 Transfer Acceleration,因为它为您提供了更大的灵活性:您可以将自己的域与 HTTPS 一起使用,您可以稍后在文件位置更改时重新配置源等。取决于您想要走多远您甚至可以将其与 S3 复制相结合,并为您的 CloudFront 分配提供多个来源,以便将对不同文件的请求定向到不同区域的 S3 存储桶。

选择哪种解决方案取决于您的用例和约束。一个限制似乎是您的成本,另一个限制可能是 CloudFront 支持的最大文件大小为 20GB,如果您要分发的文件大于此大小。


推荐阅读