Instagram如何使用Amazon S3?

5

我需要了解Instagram上传文件到Amazon S3时的工程细节。 我刚开始使用S3,认为Instagram是一个好的模型,因为每天上传数千张图片。我的应用程序有些相似。用户上传图像,可以删除自己的图像,所有图像都是公开的。

在我的项目中,我正在创建带有文件夹前缀的对象,以便为每个用户组织上传。例如:用户名/文件名

我的对象URL看起来像这样:

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

但是 Instagram:

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

我猜测distilleryimage7是存储桶名称。我不确定这种类型的URL有什么优势。我还猜想Instagram不使用“文件”存储桶,而是将所有图像存储在一个存储桶中。
请分享S3的任何最佳实践。
1个回答

5

这个URL实际上是S3默认支持的。对于美国和大多数存储桶,您可以进行特殊的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。
当然,这种URL的优点是在浏览器中使用子域名加载某些资源以加快加载速度。
当然,这只是一种解决方法。其他网站如Facebook、Twitter和Youtube使用的方法是为此类内容使用完全不同的域名。这有助于减少因这些资源而产生的cookie(这些域名上不应该存在任何cookie)。
所以这并不是S3的最佳实践,而是涉及到Web开发的一般性问题,并涵盖了如何在生产环境中编写和布局站点的更广泛视角。
是的,Instagram将所有文件存储在一个巨大的单一bucket中,这很可能是最明智的方法,当您变得庞大时,您将复制桶的部分并根据需求或像Vimeo一样将其分割成区域和子区域或将其ping到cloudfront。
编辑
阅读后我意识到Instagram并没有将所有东西都放在一个bucket中,这有点奇怪,尤其是因为一个bucket必须在整个S3中包括其他人的账户中具有唯一性。因此,他们可能没有直接使用用户名,除非该bucket名称还没有被占用。
这样做的好处很多,例如每个用户的复制和每个用户的cloudfront,但也存在缺点:
- 当显示许多用户的图像时,会有很多单独的HTTP请求,虽然它都指向S3域名,但我不确定您可以为SEO和浏览器利用多少子域名(我认为IE6中最多6个)。 - 备份和复制可能更难,因为您需要为每个用户而不是单个bucket进行操作。 - 将bucket移动到CDN等地方可能会有问题,因为您必须针对每个用户进行操作。 - 我记得在S3中看到过存储桶的最大限制,因此我不确定这将如何有效扩展。

1
非常感谢您提供的深入见解!我了解到每个S3账户可以使用100个存储桶,但每个存储桶可以拥有无限数量的对象。从Instagram的对象URL中我并没有看到用户名,所以我猜他们可能没有使用文件前缀。他们或许是在对象元数据中添加了用户名信息。 - CyberJunkie
@CyberJunkie 是的,我想到用户名的原因是因为 distilleryimage7,但如果那不是一个用户名,那我撤回我的编辑。他们每个用户使用一个存储桶似乎非常奇怪。我处理视频的方式是将S3 URL存储在数据库行中,这给了我获取S3对象URL的方法。 - Sammaye
是的,distilleryimage7 是我认为的存储桶名称。他们不能为每个用户都有一个存储桶,因为只允许100个。存储桶名称中的数字会有所不同。我也将对象数据存储在数据库表中,例如名称、大小、类型、添加日期等。这样我就可以减少 API 请求并直接使用我的数据库。 - CyberJunkie

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