Celery介紹
- Celery 是一個 基於python開發的分佈式異步消息任務隊列,通過它可以輕鬆的實現任務的異步處理, 如果你的業務場景中需要用到異步任務,就可以考慮使用celery
- 你想對100臺機器執行一條批量命令,可能會花很長時間 ,但你不想讓你的程序等着結果返回,而是給你返回 一個任務ID,你過一段時間只需要拿着這個任務id就可以拿到任務執行結果, 在任務執行ing進行時,你可以繼續做其它的事情
- Celery 在執行任務時需要通過一個消息中間件來接收和發送任務消息,以及存儲任務結果, 一般使用rabbitMQ or Redis
Celery有以下優點
- 簡單:一單熟悉了celery的工作流程後,配置和使用還是比較簡單的
- 高可用:當任務執行失敗或執行過程中發生連接中斷,celery 會自動嘗試重新執行任務
- 快速:一個單進程的celery每分鐘可處理上百萬個任務
- 靈活: 幾乎celery的各個組件都可以被擴展及自定製
Celery基本工作流程圖
user:用戶程序,用於告知celery去執行一個任務。
broker: 存放任務(依賴RabbitMQ或Redis,進行存儲)
worker:執行任務
Celery定時任務的架構
Celery 是一個強大的分佈式任務隊列,它可以讓任務的執行完全脫離主程序,甚至可以被分配到其他主機上運行。我們通常使用它來實現異步任務( async task )和定時任務( crontab )。 異步任務比如是發送郵件、或者文件上傳, 圖像處理等等一些比較耗時的操作 ,定時任務是需要在特定時間執行的任務。它的架構組成如下圖:
任務隊列
任務隊列是一種跨線程、跨機器工作的一種機制.
任務隊列中包含稱作任務的工作單元。有專門的工作進程持續不斷的監視任務隊列,並從中獲得新的任務並處理.
任務模塊
包含異步任務和定時任務。其中,異步任務通常在業務邏輯中被觸發併發往任務隊列,而定時任務由 Celery Beat 進程週期性地將任務發往任務隊列。
消息中間件 Broker
Broker ,即爲任務調度隊列,接收任務生產者發來的消息(即任務),將任務存入隊列。 Celery 本身不提供隊列服務,官方推薦使用 RabbitMQ 和 Redis 等。
任務執行單元 Worker
Worker 是執行任務的處理單元,它實時監控消息隊列,獲取隊列中調度的任務,並執行它。
任務結果存儲 Backend
Backend 用於存儲任務的執行結果,以供查詢。同消息中間件一樣,存儲也可使用 RabbitMQ, Redis 和 MongoDB 等。
使用 Celery 實現異步任務的步驟:
(1) 創建一個 Celery 實例
(2) 啓動 Celery Worker ,通過delay() 或 apply_async()(delay 方法封裝了 apply_async, apply_async支持更多的參數 ) 將任務發佈到broker
(3) 應用程序調用異步任務
(4)存儲結果 (發佈的任務需要return纔會有結果,否則爲空)
Celery Beat:任務調度器,Beat進程會讀取配置文件的內容,週期性地將配置中到期需要執行的任務發送給任務隊列
使用 Celery 實現定時任務的步驟:
(1) 創建一個 Celery 實例
(2) 配置文件中配置任務 ,發佈任務 celery A xxx beat
(3) 啓動 Celery Worker
(4) 存儲結果
celery原理
celery應用場景
- 異步任務
- 發郵件、發送消息
- 自動化工單中耗時任務
- 所有需要異步處理的請求都可以
- 定時任務
- 工單系統定時獲取超時工單進行延時報警
- 對過期會員進行清理