区分celery、kombu、PyAMQP和RabbitMQ/ironMQ
我想把图片上传到S3服务器,但在上传之前,我想生成三种不同大小的缩略图,并且希望这个过程不在请求/响应的循环中进行,所以我使用了celery。我看过相关文档,这里是我理解的内容。如果我错了,请纠正我。
- Celery可以帮助你管理任务队列,而不需要在请求和响应的循环中进行。
- 还有一个叫carrot/kombu的东西——这是一个Django的中间件,用来打包通过celery创建的任务。
- 第三层是PyAMQP,它帮助carrot与一个代理进行通信,比如RabbitMQ、Amazon SQS、ironMQ等。
- 代理会在不同的服务器上运行,为你处理任务。
根据我的理解,如果多个用户同时上传图片,celery会把调整大小的任务放入队列,实际的调整大小操作会在ironMQ服务器上进行,因为它在heroku上提供了很棒的附加功能。
现在我有一些疑问:
但是在图片调整大小后,ironMQ会把它推送到S3服务器吗?还是会在处理完成后通知我……我对此不太清楚。
celery和kombu/carrot之间有什么区别,能详细解释一下吗?
2 个回答
“IronMQ和RabbitMQ/AMQP之间最大的区别之一是,IronMQ是托管和管理的,这意味着你不需要自己搭建服务器,也不用担心服务器的运行时间。”
“目前至少有两个可以托管的RabbitMQ服务选项:Bigwig和CloudAMQP。Celery应该可以很好地与这两者配合使用。”
IronMQ 并不会自动处理你的任务,它只是作为 Celery 的后台,帮助记录哪些工作需要完成。
那么,事情是这样进行的。假设你有两台服务器,一台是你的网页服务器,另一台是 Celery 服务器。网页服务器负责处理用户的请求,而 Celery 服务器则负责生成缩略图并将它们上传到 S3。下面是一个典型请求的流程:
- 用户将图片上传到你的网页服务器。
- 你需要把这张图片存储到某个地方——我个人建议你可以直接把它放到 S3 上,但你也可以选择把它存储在其他地方,比如 IronCache,以 base64 编码的形式。关键是要把它放在 Celery 服务器能够访问的地方。
- 你在 Celery 上排队一个任务,把图片的位置传给 Celery 服务器。
- Celery 服务器下载这张图片,生成缩略图,然后上传到 S3。接着,它会把 S3 的网址存储在任务结果中。
- 网页服务器会等到任务完成后,再访问结果。或者,你也可以让 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 是托管的,这样你就不需要自己搭建和管理服务器了。
完全透明:我在 Iron.io 工作,这家公司就是 IronMQ 的背后团队。