在S3中存储头像的最低成本方法

89次阅读
没有评论

问题描述

在他的网站上允许用户上传头像,并将其上传到S3中。每个用户目前只能拥有一个头像,所以他目前只是将文件名设置为用户ID。然而,用户可能会更换头像,这会导致问题。因为S3正在传播到CloudFront,所以当他们上传新头像时(因为它替换了旧的头像文件),他需要使文件名的缓存无效,但CloudFront的无效操作是昂贵的。

他认为Amazon似乎希望他不要删除旧文件,而是给新头像一个新的名称,并将旧文件保留在那里,即使没有任何人再使用它。这样他可以避免无效操作。

另一种选择是根本不使用CloudFront,只需上传到S3,并使S3存储桶公开。但是这样做的问题是,CloudFront在GET请求的成本和数量上更为慷慨(CloudFront为每月200万次,而S3存储桶仅为每月2万次)。

在上述背景下,他有以下三种选择,但在这三个选择中,他不确定如何在成本方面进行权衡:

  1. 使用CloudFront,并在S3中替换文件,然后使CloudFront中的文件无效。
  2. 只是将更多文件存储在S3存储桶中,然后使用CloudFront。
  3. 不使用CloudFront,只需在S3中替换文件,然后从存储桶中提供文件。

解决方案

请注意以下操作可能涉及版本差异和费用成本。请根据您的需求和具体情况进行选择。

选择1:在CloudFront中替换文件并使其无效

在此选项中,您可以选择在S3中替换用户的头像文件,并且在更新后使CloudFront中的文件缓存无效。这可能会导致CloudFront的成本较高,因为无效操作是昂贵的。但是,这是一种较为直接的方法。

操作步骤:

  1. 将新的头像上传到S3中,将其文件名设置为用户ID。
  2. 获取用于新头像的文件URL。
  3. 在CloudFront控制台中,创建一个无效操作以使文件URL无效。

选择2:在S3存储桶中保留更多文件

这个选项涉及到在S3存储桶中保留更多的文件,即使它们不再被任何人使用。您可以使用随机哈希值作为文件名来避免大量文件名相同的问题。

操作步骤:

  1. 将新的头像上传到S3中,使用随机哈希值作为文件名。
  2. 每当用户更换头像时,将旧的头像保留在S3存储桶中,使用随机哈希值作为文件名。
  3. 使用CloudFront来提供这些头像文件,以获得更好的用户体验和较低的延迟。

选择3:不使用CloudFront,直接使用S3存储桶

如果您关心GET请求的成本和量,并且不太关心延迟,可以考虑直接使用S3存储桶,而不使用CloudFront。

操作步骤:

  1. 将新的头像上传到S3存储桶中,使用用户ID作为文件名。
  2. 使用S3存储桶的公开URL来提供头像文件。

其他考虑事项

  • 为了确保更好的性能,当存储大量小文件时,可以考虑将文件名设置为随机哈希值,以减少S3存储桶的哈希冲突。了解S3哈希算法的工作原理,以便做出明智的决策。
  • 如果成本是一个关键问题,您可以通过更复杂的算法来处理头像的更新和删除。您可以使用AWS Lambda函数来处理这些操作,以确保在上传新头像时同时删除旧头像。

无论您选择哪种方案,都应该根据您的需求和预算进行权衡。了解您的用户需求和预期的性能,从而选择最适合您情况的解决方案。

正文完