5

在将文件上传到 Amazon S3 时,我需要对 Instagram 的工程有所了解。我刚开始使用 S3,我认为 Instagram 是一个很好的模型,因为他们每天上传数千张图片。我的应用有点类似。用户上传图片,可以删除自己的图片,所有图片都是公开的。

在我的项目中,我正在创建具有文件夹前缀的对象来组织每个用户的上传。例如username/filename

我的对象 URL 如下所示:

https://s3.amazonaws.com/my_bucket/username/28c3d2c6ec098bd077d6b9cb5f13869d.jpg

但Instagram:

http://distilleryimage7.s3.amazonaws.com/f4947c1004ca11e2a0c81231380ff428_7.jpg

我猜这distilleryimage7是存储桶的名称。我不确定这种类型的 URL 有什么优势。我还猜测 Instagram 不使用存储桶“文件”并将所有图像存储在一个存储桶中。

请分享 S3 中的任何最佳实践。

4

1 回答 1

5

此 URL 实际上是 S3 默认支持的 URL。对于美国和大多数存储桶,您可以执行特殊的 DNS 解析,它允许您使用:

http://my_bucket.my_domain.com

对您自己的记录进行一些更改或:

http://my_bucket.s3.amazonaws.com

如果您不想更改任何 A 记录(小入门:http ://docs.amazonwebservices.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingCustomURLs )。

这种类型的 url 的优点当然是对某些资产使用子域以加快浏览器加载速度的普遍想法。

当然,这是一个修复。Facebook、Twitter 和 Youtube 等其他网站使用的一种方法是使用完全不同的域来处理此类内容。这很有帮助,因为它是专门为这些资产设计的剥离域(这些域上也不应该存在 cookie)。

因此,这实际上并不是 S3 的最佳实践,而是更多一般的 Web 开发,涵盖了如何在生产环境中编程和布局站点的更广泛的观点。

是的,Instagram 会将所有文件存放在一个巨大的单个存储桶中,这很可能是最明智的做法,然后当您变大时,您将复制部分存储桶并根据需求将它们拆分到区域和子区域或 ping 它们像 Vimeo 一样到云端。

编辑

在进一步阅读之后,我也意识到 Instagram 并没有将所有东西都放在一个桶里。真的有点奇怪,特别是因为一个桶必须在整个 S3 中被唯一命名,包括其他人的账户。因此,除非尚未使用该存储桶名称,否则他们可能不会直接使用用户名。

不过,这样做有很大的好处。就像每个用户的复制和每个用户的云端一样,但也有缺点:

  • 当显示许多用户图像时,会出现很多单独的 http 请求,这完全是 S3 域,但我不确定 SEO 和浏览器允许有多少子域来利用它(我认为 IE6 中有 6 个)。

  • 备份和复制可能会更难,因为您需要为每个用户而不是单个存储桶执行操作。

  • 将存储桶移动到 cdn 等可能会出现问题,因为您必须再次为每个用户执行此操作。

  • 我想我记得在 S3 中看到了存储桶的最大限制,所以我不确定这将如何有效地扩展 tbh。

于 2012-09-22T20:55:32.630 回答