我想将图像上传到 S3 服务器,但在上传之前我想生成 3 种不同大小的缩略图,我希望它在请求/响应周期之外完成,因此我使用的是 celery。我已经阅读了文档,这是我的理解。如果我错了,请纠正我。
- Celery 可帮助您在请求响应周期之外管理任务队列。
- 还有一个叫做 carrot/kombu 的东西——它是一个 django 中间件,用于打包通过 celery 创建的任务。
- 然后是第三层 PyAMQP,它促进了胡萝卜与代理的通信。例如。 RabbitMQ、AmazonSQS、ironMQ等
- 经纪人位于不同的服务器上并为您做事。
现在我的理解是 - 如果多个用户同时上传图片,celery 会将调整大小排队,并且实际上会在 ironMQ 服务器上进行调整,因为它在 heroku 上提供了一个很酷的插件。
现在疑惑:
但是图片调整大小后,ironMQ会把它推送到S3服务器,还是处理完成后通知..我不清楚。
celery和kombu/carrot有什么区别,能不能说的形象点。
最佳答案
IronMQ 不会为您处理您的任务;它只是作为 Celery 的后端来跟踪需要执行的工作。
所以,这就是发生的事情。假设你有两台服务器,你的 web 服务器和你的 Celery 服务器。您的 Web 服务器负责处理请求,您的 Celery 服务器创建缩略图并将它们上传到 S3。下面是一个典型的请求:
- 您的用户将图像上传到您的网络服务器。
- 您将该图像存储在某处——我个人建议您立即将其存储在 S3 上,但您也可以将其存储在例如 IronCache 中。 , base64 编码。重点是将它放在您的 Celery 服务器可以访问的地方。
- 您在 Celery 上排队作业,将图像的位置传递给您的 Celery 服务器。
- 您的 Celery 服务器下载图像、生成缩略图并将它们上传到 S3。然后它将 S3 URL 存储在作业结果中。
- 您的网络服务器会等待作业完成,然后才能访问结果。或者,您可以让 Celery 服务器将结果存储在数据库本身中。关键是 Celery 服务器会完成繁重的工作(生成缩略图)并且不会在它执行时阻止请求循环。
我写了一个在 Heroku 上使用 IronMQ 的例子。你可以在这里看到它:http://iron-celery-demo.herokuapp.com .您可以查看示例的来源 on Github和 read the tutorial ,它非常详尽地逐步解释了如何在 Heroku 上部署 Celery。
清除 AMQP 内容:
- IronMQ 是由 Iron.io 开发的基于云的消息队列服务。
- AMQP 是一种开放的消息传递规范
- RabbitMQ 是(据我所知)最流行的 AMQP 规范实现。
- PyAMQP 是一个 Python 库,可让 Python 客户端与任何 AMQP 实现(包括 RabbitMQ)进行通信
IronMQ 和 RabbitMQ/AMQP 之间的最大区别之一是 IronMQ 是托管和管理的,因此您不必自己托管服务器,也不必担心正常运行时间。该规范在差异化方面提供了更多,并且存在潜在差异,但 Celery 将其中的大部分抽象化了。因为您使用的是 Celery,所以您可能会注意到的唯一区别是 IronMQ 是托管的,因此您不必站起来管理自己的服务器。
全面披露:我受雇于 Iron.io,IronMQ 背后的公司。
关于python - 区分celery、kombu、PyAMQP和RabbitMQ/ironMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15121519/