Django 集成 Celery 異步任務隊列(Broker RabbitMQ版)

一、前言

在Django Web平臺開發中,碰到一些請求執行的任務時間較長的情況,爲了加快用戶的響應時間,就可以採用Celery異步任務的方式來解決

好文章 記得收藏+點贊+關注額 !!!

---- Nick.Peng


二、關於 Celery

  • Celery是基於Python開發的一個分佈式任務隊列框架,支持使用任務隊列的方式在分佈的機器/進程/線程上執行任務調度。
  • 如圖Celery的架構,它採用典型的生產者-消費者模式,主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)。
  • 實際應用中,用戶從Web前端發起一個請求,我們只需要將請求所要處理的任務丟入任務隊列broker中,由空閒的worker去處理任務即可,處理的結果會暫存在後臺數據庫backend中。我們可以在一臺機器或多臺機器上同時起多個worker進程來實現分佈式地並行處理任務。
    在這裏插入圖片描述

三、Django 中集成 Celery

在實際使用過程中,發現Celery在Django裏的實現與其在一般.py文件中的實現還是有很大差別,Django有其特定的使用Celery的方式。這裏着重介紹Celery在Django中的實現方法,簡單介紹與其在一般.py文件中實現方式的差別。

  • 建立消息隊列
    在這裏插入圖片描述
    缺少監控就意味着這個監控已經失效,因此相關的 Flower、Celery events、celerymon 和其他基於此功能的監控工具全部失效。
    遠程管理控制是指可以通過 celery inspect 和 celery control(以及使用遠程控制API的工具)在程序運行時檢查和管理職程(Worker)的能力

    所以這裏我們採用RabbitMQ來實現消息中間件,輸入以下命令安裝:
    sudo apt-get install rabbitmq-server
    安裝成功後,rabbitmq-server就已經安裝好並運行在後臺了。也可以使用service rabbitmq-server status查看運行狀態

    另外也可以通過命令sudo rabbitmq-server -detached來在後臺啓動rabbitmq server。
    更多的命令可以參考rabbitmq官網的用戶手冊:https://www.rabbitmq.com/manpages.html

  • 安裝django-celery

    pip install celery
    pip install django-celery
    
  • 配置settings.py
    首先,在Django工程的settings.py文件中加入如下配置代碼:

    import djcelery
    
    djcelery.setup_loader()
    # 設置代理人broker
    BROKER_URL= 'amqp://guest@localhost//'
    # 設置結果存儲位置
    CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'
    

    說明:

    • 當djcelery.setup_loader()運行時,Celery便會去查看INSTALLD_APPS下包含的所有app目錄中的tasks.py文件,找到標記爲task的方法,將它們註冊爲celery task。

    • BROKER_URL和CELERY_RESULT_BACKEND分別指代你的Broker的代理地址以及Backend(result store)數據存儲地址。

    • 在Django中如果沒有設置backend,會使用其默認的後臺數據庫用來存儲數據。注意,此處backend的設置是通過關鍵字CELERY_RESULT_BACKEND來配置,與.py文件中實現celery的backend設置方式有所不同。

    • py文件中是直接通過設置backend關鍵字來配置,如下所示:

      app = Celery('tasks', backend='amqp://guest@localhost//', broker='amqp://guest@localhost//')
      

      然後,在INSTALLED_APPS中加入djcelery:

      INSTALLED_APPS = (
          ……   
          'qv',
          'djcelery'
          ……   
      )   
      
  • 在要使用該任務隊列的app根目錄下(比如qv),建立tasks.py,比如:
    在這裏插入圖片描述
    在tasks.py中我們就可以編碼實現我們需要執行的任務邏輯,在開始處import task,然後在要執行的任務方法開頭用上裝飾器@task。
    需要注意的是,與一般的.py中實現celery不同,tasks.py必須建在各app的根目錄下,且不能隨意命名。

  • 生產任務
    在需要執行該任務的View中,通過build_job.delay的方式來創建任務,並送入消息隊列。比如:
    在這裏插入圖片描述

  • 啓動worker的命令

    #先啓動服務器
    python manage.py runserver
    #再啓動worker 
    python manage.py celery worker -c 4 --loglevel=info
    

四、利用 flower 監控管理 Celery 集羣

Celery提供了一個工具flower,將各個任務的執行情況、各個worker的健康狀態進行監控並以可視化的方式展現,如下圖所示:
在這裏插入圖片描述
可視化監控實現的方式:

  • 安裝flower:
    pip install flower
  • 啓動flower(默認會啓動一個webserver,端口爲5555):
    python manage.py celery flowercelery flower -A project_name --port=5555
  • 進入http://localhost:5555即可查看。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章