基于 RabbitMQ/Celery 的 Django 异步任务 (一)

2,462 阅读2分钟
原文链接: zhuanlan.zhihu.com
之前用Node写了服务中间件来调用阿里云的服务接口与自家的图片处理处理服务,由于时间紧迫,只写了简单的记录功能,也基本没法保证任务能够快速分发到Worker上,虽然通过一些Trick的方式能够让任务基本都可以送达,但是为了能够更友好的展示以及查询信息,用Django重写中间件

Django对于中间来说,有几个显而易见的好处:

  • 管理界面简单(基本不需要再花时间去写了,自带)
  • ORM功能完善
  • XML处理方便
  • Python组件丰富
  • 易于与任务/消息队列框架整合

基于上述几个优点,经过一些测试,采用了以下技术栈:

  • Django
  • Celery
  • RabbitMQ
  • MySQL

之前使用Gearman来处理分布式任务,Worker就是用Python调用可执行程序来处理图像并返回结果,所以这里换用Celery也基本比较简单,简单的网络/服务器如下图所示:

Django与RabbitMQ部署在香港节点。通过阿里云的内网来连接,一方面可以保证速度,另一方面,也节省了网络费用;同时,数据库是使用RDS(MySql),同样通过内网连接


RabbitMQ作为消息系统,负责接收与发送消息到对应的Queue


Queue/Worker分别部署在以下节点:

  • CN-Hangzhou
  • CN-Hongkong
  • US-West-1

通过连接到香港节点的RabbitMQ来接收任务与返回结果


为了方便部署在大陆、香港与美国的Queue能够在处理完消息后返回结果,在每一个Queue中都通过git的submodue引入了celery-client,通过celery-client去发送消息(结果)到与Django部署在同一节点的Default Queue去更新数据库

----

未完待续。

(下一节分享如何组织各种Queue以及整合Celery遇到的蛋疼问题)