分布式队列Celery实例:Tornado+celery实现后台耗时处理

需求

目前主要采用Django为后台服务框架,流量不大,但是处理比较耗资源操作时,非常耗时,比如导出大量数据的Excel、word文件等。

效果

思路

为了解决耗时问题,决定采用Tornado+celery的方案来提升性能和前端用户体验!
基础框架:Django(略)、Tornado
任务队列:Celery+Redis
实时推送:WebSocket(略)

实现基于Tornado的核心功能,Django作为web请求接收,当有耗时请求时就交给Tornado,Tornado+celery+Redis实现异步队列处理耗时请求,处理完成后将处理结果通过WebSocket推送给前台,这样就实现了简单后台异步队列处理耗时请求。

本文概要:
- Tornado接收到耗时请求给Brokers——生产task
- CeleryWorkers处理完请求把结果给Result Stores(这里采用RPC)——消费task
- TornadoRPC接收task处理结果

实现

Demo

git clone https://github.com/jervon-demo/tornado_celery_test.git
pip install -r requirements.txt

项目目录

. 项目根目录
├── celery_service  # celery目录
│   ├── celeryconfig.py # celery配置文件
│   ├── proj
│   │   ├── base_task.py        # task
│   │   ├── celery_app.py   # celery启动
│   │   └── tasks.py
│   └── service
│       └── task_done.py    # task处理结果接收
├── common
│   ├── jsondump.py # json输出格式化
│   └── settings.py # Tornado配置文件
├── handler
│   ├── server_sendee.py    # 生产task、task结果处理
│   └── wsv2.py # WebSocket
├── requirements.txt
├── tornado_app.py  # tornado启动
└── urls.py # tornado路由

运行

cd tornado_celery_test
# 启动Tornado
python tornado_app.py

cd celery_service/
# 启动celery应用
celery -A proj worker -l info
# 启动flower
celery flower -A proj

流程

  • Tornado生产task
  • 队列Brokers(redis)
  • Celery取出任务并消费task
  • 返回task处理结果给Tornado

原理

Tornado基于Rediscelery实现:
- 任务接收/生产
- 任务分发
- 任务处理
- 任务处理结果返回

You may also like...

4 Responses

  1. aaaaaa说道:

    能看下demo吗 这么说一下看不明白

  2. lyuanx说道:

    git上有demo实例吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注