8

我想将图像上传到 S3 服务器,但在上传之前我想生成 3 种不同大小的缩略图,并且我希望它在请求/响应周期之外完成,因此我使用的是 celery。我已经阅读了文档,这是我所理解的。如果我错了,请纠正我。

  1. Celery 可帮助您在请求响应周期之外管理任务队列。
  2. 然后有一个叫做胡萝卜/kombu 的东西——它是一个 django 中间件,用于打包通过 celery 创建的任务。
  3. 然后是促进胡萝卜与代理通信的第三层 PyAMQP。例如。RabbitMQ、AmazonSQS、ironMQ 等。
  4. 经纪人位于不同的服务器上,为您做事。

现在我的理解是 - 如果多个用户同时上传图片,celery 将排队调整大小,并且调整大小实际上会发生在 ironMQ 服务器上,因为它在 heroku 上提供了一个很酷的插件。

现在的疑惑:

  1. 但是在调整图像大小后,ironMQ会将其推送到S3服务器,还是会在该过程完成后通知..我不清楚。

  2. 芹菜和昆布/胡萝卜有什么区别,你能生动地解释一下吗?

4

2 回答 2

13

IronMQ 不会为您处理您的任务;它只是作为 Celery 的后端来跟踪需要执行的工作。

所以,这就是发生的事情。假设你有两台服务器,你的 web 服务器和你的 Celery 服务器。您的 Web 服务器负责处理请求,您的 Celery 服务器创建缩略图并将其上传到 S3。下面是一个典型的请求:

  1. 您的用户将图像上传到您的网络服务器。
  2. 您将该图像存储在某个地方-我建议您将其放在 S3 上,个人,但您也可以将其存储在例如IronCache中,base64 编码。关键是把它放在你的 Celery 服务器可以访问的地方。
  3. 你在 Celery 上排队工作,将图像的位置传递给你的 Celery 服务器。
  4. 您的 Celery 服务器会下载图像、生成缩略图并将其上传到 S3。然后它将 S3 URL 存储在作业结果中。
  5. 您的 Web 服务器会等到作业完成,然后才能访问结果。或者,您可以让 Celery 服务器将结果存储在数据库本身中。关键是 Celery 服务器完成了繁重的工作(生成缩略图)并且在执行时不会阻止请求循环。

我写了一个在 Heroku 上使用 IronMQ 的例子。你可以在这里看到它:http: //iron-celery-demo.herokuapp.com。您可以在 Github 上查看示例的源代码并阅读教程,其中非常详尽地逐步解释了如何在 Heroku 上部署 Celery。

要清除 AMQP 的东西:

  • IronMQ 是 Iron.io 开发的基于云的消息队列服务。
  • AMQP 是一个开放的消息传递规范
  • RabbitMQ 是 AMQP 规范最流行的实现(据我所知)。
  • PyAMQP 是一个 Python 库,它允许 Python 客户端与 AMQP 的任何实现进行通信,包括 RabbitMQ

IronMQ 和 RabbitMQ/AMQP 之间的最大区别之一是 IronMQ 是托管和管理的,因此您不必自己托管服务器并担心正常运行时间。该规范在差异化方面提供了更多信息,并且存在潜在的差异,但 Celery 将其中的大部分抽象出来。因为您使用的是 Celery,所以您可能会注意到的唯一区别是 IronMQ 是托管的,因此您不必站起来管理自己的服务器。

全面披露:我受雇于 IronMQ 背后的公司 Iron.io。

于 2013-02-27T23:37:29.517 回答
2

“IronMQ 和 RabbitMQ/AMQP 之间的最大区别之一是 IronMQ 是托管和管理的,因此您不必自己托管服务器并担心正常运行时间。”

Currently there are at least two hosted managed RabbitMQ-as-a-service options: Bigwig and CloudAMQP. Celery should work well with both.

于 2013-02-28T08:41:42.020 回答