关于使用带有远程存储的 sorl-thumbnails 的 celery 的指针?

Posted

技术标签:

【中文标题】关于使用带有远程存储的 sorl-thumbnails 的 celery 的指针?【英文标题】:Pointers on using celery with sorl-thumbnails with remote storages? 【发布时间】:2012-05-12 13:25:33 【问题描述】:

我很惊讶在搜索如何将 celery 任务与 sorl-thumbnails 和 S3 一起使用时,我只看到“使用 celery”。

问题:使用远程存储在生成缩略图时会导致大量延迟(对于包含许多缩略图的页面,想想 100 秒以上),而缩略图引擎会从远程存储下载原件,对其进行处理,然后上传回 s3。

在 sorl 中哪里是设置 celery 任务的好地方,我应该叫什么?

您的任何经验/想法将不胜感激。

我将开始挖掘 Sorl 的内部结构,以找到一个更有用的地方来延迟这项任务,但还有一些事情我很好奇之前是否已经解决了。

    立即返回什么图像?必须以某种方式告诉 Sorl 返回的图像不是真正的缩略图。 celery 完成任务后,缓存必须失效。

    干净地处理多个缩略图生成请求(只需要给定缓存键的第一个请求)

目前,我通过使用 nginx 反向代理缓存暂时解决了这个问题,该缓存可以在后端花费时间生成昂贵的页面(在巨大的产品网格上调整巨大的 PNG)时提供命中,但这是一个非常手动的过程。

【问题讨论】:

djangosnippets.org/snippets/1562 可能有帮助 @jpic 谢谢,但那已经 3 岁了 - sorl 已经可以与远程存储一起使用。我需要帮助的是异步生成远程存储缩略图... @YujiTomita 你在这方面有什么进展吗?很高兴听到你的发现。 @jamesc,还没有!我可以在这里加个赏金.. @JosvicZammit,很遗憾我没有时间查看它。我很可能会自己重新托管文件(在尝试清理文件系统/创建本地开发环境时遇到了很多问题)并使用 CloudFront 之类的东西来满足 CDN + 99.99% 的托管需求。艾丹在下面的那篇文章看起来很有希望。不知何故,当 celery 任务完成时,包含虚拟图像的缓存 html 页面必须失效。 【参考方案1】:

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

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

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

【讨论】:

姗姗来迟的评论:这看起来棒极了。太感谢了!我会在我的下一个项目中检查它。这一直是使用远程存储的主要瓶颈。在 django 生态系统中使用远程存储所增加的工程挑战与通过让应用服务器真正独立解决的操作障碍。 虽然这是一个有趣的实验,但我认为您应该使用 Cloudinary 或 Imgix 之类的东西。【参考方案2】:

据我了解,Sorl 可以正常使用 S3 存储,但速度很慢。

我相信你知道你需要什么尺寸的图片。

您应该在图片上传后启动 celery 任务。在您调用的任务中 sorl.thumbnail.default.backend.get_thumbnail(file, geometry_string, **options)

Sorl 将生成一个缩略图并将其上传到 S3。下次您从模板请求图像时,它已经缓存并直接从亚马逊的服务器提供服务

一种在处理图像时处理占位符缩略图的简洁方法。

为此,您需要覆盖 Sorl 后端。向get_thumbnail 函数添加新参数,例如generate=False。当你从 celery 调用这个函数时,传递 generate=True

并且在函数更改中它的逻辑,所以如果拇指不存在并且generate 是 True 你就像标准后端一样工作,但是如果 generate 是 false 你返回你的占位符图像,文本像 “我们现在处理您的图像,稍后再回来" 不要拨打backend._create_thumbnail。如果您认为缩略图可能会被意外删除,您可以在这种情况下启动任务。

希望对你有帮助

【讨论】:

【参考方案3】:

我认为您想要做的是将THUMBNAIL_BACKEND 设置为覆盖_create_thumbnail 方法的自定义类。不是在该函数中生成缩略图,而是使用与给定函数相同的参数调用 _create_thumbnail 的 celery 任务。缩略图在请求期间不可用,但会在后台生成。

【讨论】:

以上是关于关于使用带有远程存储的 sorl-thumbnails 的 celery 的指针?的主要内容,如果未能解决你的问题,请参考以下文章

带有定期付款的远程信用卡存储(可能是 PayPal)

Git关于远程分支--我的理解:远程分支永远是存储最新的版本。

带有 PHP 的 Jira 肥皂

NativeScript + ngrx 存储 + 远程开发工具

无法在 Windows 的作曲家中使用远程存储库

如何像数组形式远程存储extjs一样返回数据