0

我们有很多图像存储在 AWS s3 中。我们计划提供缩略图供用户预览。如果我将它们存储在 S3 中,我只能一个一个地检索它们,效率不高。显示我将它们存储在数据库中吗?(我需要查询我的数据库来决定向用户展示哪组缩略图来预览)

4

3 回答 3

4

最佳答案取决于图像的使用模式。

对于许多应用程序,S3 将是最佳选择,原因很简单,您可以轻松地将 S3 用作 Amazon 的 CDN CloudFront 的源。通过使用 CloudFront(或实际上任何 CDN),图像在世界各地物理托管,并从给定用户的最快位置提供服务。

使用 S3,您根本不会检索图像。您只需在最终 HTML 页面中使用 S3 的 URL(或 CloudFront URL,如果您采用该路线)。

如果您从数据库中提供图像,则会增加 DB 上的资源消耗(更多 IO、更多 CPU 和一些用于缓存图像查询的 RAM,而这些查询不可用于缓存其他查询)。

无论您走哪条路线,预先创建缩略图而不是即时生成它。存储空间很便宜,获取(从 S3 或 DB)、处理、然后重新提供缩略图的延迟会降低用户体验。此外,如果您动态创建缩略图,您将无法从 CDN 中受益。

于 2013-06-16T17:00:59.510 回答
2

如果我将它们存储在 S3 中,我只能一个一个地检索它们,效率不高。

不,它只是因为你使用它的方式而显得低效。

S3 是大规模并行的。它可以将您的图像提供给数以万计的同时用户,而不费吹灰之力。它可以为同一个用户并行提供 100 张图片——因此您可以在加载 1 张图片的同时加载 100 张图片。那么为什么你的页面很慢?

您的浏览器正试图成为一个好公民,一次只能从网站中提取 2-4 张图像。这种“序列化”会减慢您的速度并导致瓶颈。

您可以通过在多个域上托管资产来欺骗浏览器。这称为“域分片”。您可以使用多个存储桶来执行此操作(将图像放入 4 个不同的存储桶中,具体取决于其 ID 的最后一位数字)。或者,您可以使用 CloudFront:http ://abhishek-tiwari.com/post/CloudFront-design-patterns-and-best-practices/

于 2013-06-17T12:58:20.663 回答
0

作为最佳实践,您应该将静态数据存储在 S3 中并将其引用保存在 Db 中。在您的特定情况下,您可以将文件名/超链接保存到数据库中的图像文件,您可以根据业务逻辑进行查询。

这将为您提供您现在可以从 S3 获取并将其显示给您的用户的所有图像的参考。

这还可以帮助您根据需要替换对缩略图的引用。例如,如果您正在运营一个电子商务网站,您可以轻松替换缩略图引用以指向新产品图像。

我希望这有帮助。

于 2013-06-17T08:42:53.120 回答