項目開發中經常碰到需要使用異步任務的場景,比如一個WEB請求中有運行時間很長的業務運算,如果不採用異步任務,會阻塞當前的web請求,影響用戶體驗。
celery是python的一個分佈式任務調度模塊,由消息中間件broker、任務執行體worker、任務執行結果backend三部分組成。
celery通過消息中間件broker實現消息服務,通常broker使用rabbitMQ,redis等,搭建異步任務系統時需要部署相關的消息服務,比如選擇用redis,就需要部署redis-server。
任務執行體worker可以分佈式的部署到多個節點,比如多臺機器或多個docker中。
任務執行結果backend用於保存任務執行結果,通常使用redis、MongoDB等,仍然需要部署相關的服務。
藉助docker我們可以將celery與消息服務集成在一起,提供完整的異步任務執行體。
flower是python的一個專門用於監控celery的模塊,比如可以在web頁面實時顯示celery worker的狀態、任務的狀態等,最重要的,flower還提供了REST API用於方便第三方應用直接觸發任務執行、獲取任務執行結果等,這也極大地擴展了celery的應用範圍
celery應用舉例
- Celery 是一個 基於python開發的分佈式異步消息任務隊列,通過它可以輕鬆的實現任務的異步處理,如果你的業務場景中需要用到異步任務,就可以考慮使用celery
- 你想對100臺機器執行一條批量命令,可能會花很長時間 ,但你不想讓你的程序等着結果返回,而是給你返回 一個任務ID, 你過一段時間只需要拿着這個任務id就可以拿到任務執行結果, 在任務執行ing進行時,你可以繼續做其它的事情
- Celery 在執行任務時需要通過一個消息中間件來接收和發送任務消息,以及存儲任務結果, 一般使用rabbitMQ or Redis
Celery有以下優點
1、簡單:一單熟悉了celery的工作流程後,配置和使用還是比較簡單的
2、高可用:當任務執行失敗或執行過程中發生連接中斷,celery 會自動嘗試重新執行任務
3、快速:一個單進程的celery每分鐘可處理上百萬個任務
4、靈活: 幾乎celery的各個組件都可以被擴展及自定製
Celery基本工作流程圖
user:用戶程序,用於告知celery去執行一個任務。
broker: 存放任務(依賴RabbitMQ或Redis,進行存儲)
worker:執行任務