我们在AWS s3中存储了大量图像。我们计划提供缩略图供用户预览。如果我将它们存储在S3中,我只能逐个检索它们,这样效率不高。显示我将它们存储在数据库中? (我需要查询我的数据库来决定向用户展示哪组缩略图以进行预览)
答案 0 :(得分:3)
最佳答案取决于图像的使用模式。
对于许多应用程序而言,S3将是最佳选择,原因很简单,您可以轻松地将S3用作Amazon Front CDN的Cloud Front。通过使用Cloud Front(或实际上任何CDN),图像在世界各地进行实际托管,并从给定用户的最快位置提供服务。
使用S3,您根本不会检索图像。您只需在最终的HTML页面中使用S3的URL(或者如果您沿着该路线使用Cloud Front URL)。
如果从数据库提供图像,则会增加数据库上的资源消耗(更多IO,更多CPU以及用于缓存无法缓存其他查询的图像查询的一些RAM)。
无论您走哪条路线,都要预先创建缩略图,而不是动态生成缩略图。存储空间很便宜,并且(从S3或DB)获取,处理然后重新提供缩略图的延迟将减少用户体验。此外,如果您动态创建缩略图,则无法从CDN中受益。
答案 1 :(得分:1)
如果我将它们存储在S3中,我只能逐个检索它们,这样效率不高。
不,由于您使用它的方式,它看起来效率低下。
S3大规模并行。它可以为成千上万的同时用户提供图像,而不会出汗。它可以并行地为同一个用户提供100个图像 - 因此您可以在加载1个图像所需的同一时间加载100个图像。那么为什么你的页面会变慢?
您的浏览器正在努力成为一名优秀的公民,并且一次只能从网站上提取2-4张图片。这种“序列化”正在减慢你的速度并造成瓶颈。
您可以通过在多个域上托管资源来欺骗浏览器。这称为“域分片”。您可以使用多个存储桶(将图像放入4个不同的存储桶,具体取决于其ID的最后一位)。或者,您可以使用CloudFront执行此操作:http://abhishek-tiwari.com/post/CloudFront-design-patterns-and-best-practices/
答案 2 :(得分:0)
作为最佳做法,您应将静态数据存储在S3&在Db中保存他们的参考。
在您的特定情况下,您可以将文件名/超链接保存到数据库中的图像文件,您可以根据业务逻辑进行查询。
这将为您提供现在可以从S3中获取的所有图像的参考。显示给您的用户。
这也可以帮助您根据需要替换对缩略图的引用。例如,如果您正在运行电子商务网站,则可以更换缩略图引用以轻松指向新产品图像。
我希望这会有所帮助。