python - 区分celery、kombu、PyAMQP和RabbitMQ/ironMQ

标签 python heroku rabbitmq celery kombu

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

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

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

现在疑惑:

  1. 但是图片调整大小后,ironMQ会把它推送到S3服务器,还是处理完成后通知..我不清楚。

  2. celery和kombu/carrot有什么区别,能不能说的形象点。

最佳答案

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

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

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

我写了一个在 Heroku 上使用 IronMQ 的例子。你可以在这里看到它:http://iron-celery-demo.herokuapp.com .您可以查看示例的来源 on Githubread 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/

相关文章:

Python Pandas : Convert a date string to milliseconds since epoch and back to date string?

python - 如何根据项目位置运行不同的python版本?

ios - 是否可以在 Heroku 上为 Facebook 应用程序运行一个进程?

RabbitMQ——选择性地从队列中检索消息

c# - EasynetQ 总线。订阅未触发 - 抛出 "messageType must not be null"

python - Pandas 组合连续值

python - 在 Glue pythonshell 中使用 pyarrow - ModuleNotFoundError : No module named 'pyarrow.lib'

json - 将 Grunt 应用程序部署到 heroku 时,NPM 不会安装模块依赖项

ruby-on-rails - 无法在 Heroku 上为我的 Rails 应用程序提供种子文件

erlang - 使用它进行 JSON 数据传输