Django + S3 (boto) + Sorl Thumbnail: 优化建议

Posted

技术标签:

【中文标题】Django + S3 (boto) + Sorl Thumbnail: 优化建议【英文标题】:Django + S3 (boto) + Sorl Thumbnail: Suggestions for optimisation 【发布时间】:2011-07-30 14:16:52 【问题描述】:

我在我正在开发的 Django 站点中使用 S3 存储后端,以减少来自 EC2 服务器的负载,并允许多个网络服务器(冗余、负载平衡)访问同一组上传的媒体。

我们的模板中使用了 Sorl.thumbnail (v11) 模板标签,以允许灵活地调整图像大小/裁剪。

在富媒体页面上性能不是很好,当第一次访问包含需要生成缩略图的页面时,请求甚至超时。

我知道这是由于 sorl 缩略图检查/从 S3 下载原始图像(可能非常大和高分辨率),并渲染/检查/上传缩略图。

您认为此设置的最佳解决方案是什么?

除了 S3 副本之外,我还看到了存储本地文件副本的建议(当使用多个服务器进行负载平衡时,这不是很好)。我还看到它建议存储 0 字节文件来愚弄 sorl.thumbnail。

还有其他建议或更好的方法来解决这个问题吗?

【问题讨论】:

对于需要在 S3 上使用缩略图的 Flask 用户来说,这是一个提醒。我分叉了flask-thumbnails 并创建了flask-thumbnails-s3。不幸的是,它没有做任何花哨的排队或异步的东西,比如上面链接的各种基于 Django 的解决方案(欢迎贡献!)......但它有效。 【参考方案1】:

现在创建sorl 缩略图时考虑了远程慢速存储。然而,缩略图的第一次创建是通过查询存储完成的,例如首先从模板访问,但之后引用被缓存在键值存储中。您仍然需要第一次查询和创建,一个解决方案是在上传图像时使用具有相同选项的低级 api sorl.thumbnail.get_thumbnail。上传图片后,将此缩略图创建作业添加到 celery 之类的 que 中。

【讨论】:

这仍然是该问题的最佳解决方案吗? @sorl 如果生成了密钥库,sorl 缩略图是否仍会访问存储?【参考方案2】:

您可以使用Sorlery。它结合了 sorl 和 celery 通过工人创建缩略图。非常小心不要在工作线程之外进行任何文件系统访问。

可以通过将THUMBNAIL_DUMMY_SOURCE 设置为适当的占位符来控制立即返回的缩略图(在工作人员有机会之前)。

第一次请求缩略图时会创建作业,随后的请求将提供虚拟图像,直到工作线程完成。

【讨论】:

我在使用 S3 时所做的完全相同,但我有一个问题。如果我刷新浏览器,则会重复相同的任务,直到缩略图生成完成并缓存。看起来你没有遇到这个问题。但是你会怎么解决呢?似乎 celery 不知道正在重复相同的任务。【参考方案3】:

与@Aidan 的解决方案几乎相同,我对 sorl-thumbnail 进行了一些调整。我还用 celery 预先生成缩略图。我的代码在这里sorl_thumbnail-async

但我开始知道easy_thumbnails 完全符合我的要求,所以我在我当前的项目中使用它。您可能会发现有关该主题的有用简短帖子是 here

【讨论】:

最后一个链接是 404'd :(【参考方案4】:

到目前为止我发现的最简单的解决方案实际上是这个第三方服务:http://cloudinary.com/

【讨论】:

看起来是一个很酷的服务——可以让python(和其他)应用程序的缩略图生成变得更加容易。感谢您指出!

以上是关于Django + S3 (boto) + Sorl Thumbnail: 优化建议的主要内容,如果未能解决你的问题,请参考以下文章

django-storages + sorl_thumbnail + S3 不能很好地协同工作(URL 不匹配)

Django-storages + boto + S3 collectstatic 的最小凭据

升级到 Django 1.7。出现错误:无法序列化:<storages.backends.s3boto.S3BotoStorage 对象

使用带有 Compressor 的 Boto 的 Django AWS S3 无法压缩 UncompressableFileError

Django 简单缩略图与 sorl-thumbnail 的区别

无法加载 Boto 的 S3 绑定。 (安装博托)