本篇主要介紹關於分布式異步任務隊列神器--celery,本篇主要參考其他的博客(會在下面注釋)和相關資源進行整理而成。
一、引入異步任務
當我們做網站后端程序開發時,會遇到這種情況:
1、在沒有使用異步任務時:當我們點擊獲取短信驗證碼的時候或者通過郵箱注冊時,會發現 在點擊過后會過一小會 才進入倒計時,這是由於 在向后端發送請求發送短信驗證碼或者郵箱驗證時,后端會調用第三方平台發送短信或者通過SMTP服務器進行郵箱發送,而這個過程是一個較為耗時的操作,那么客戶端會等待很久,造成不好的用戶體驗。

2、使用異步任務:若我們點擊獲取短信驗證碼或者郵箱注冊驗證時,服務器在接收到請求,將任務交給另外一個進程去執行,而直接返回響應,那么用戶則會馬上進入倒計時的操作,即用戶可以做接下來的操作。故:

故:我們通常可以將一些耗時耗資源的任務交給異步任務來進行處理,同時也會將一些定時任務(例如在用戶登錄或者注冊后5分鍾,給用戶發送一份表示歡迎的郵件),或者讓異步任務執行一些按時操作任務(例如每一個小時查詢一下天氣預報,並存儲至數據庫中進行數據分析)等。
二、celery介紹
Celery是一個專注於實時處理和任務調度的分布式任務隊列。所謂任務就是消息,消息中的有效載荷中包含要執行任務需要的全部數據。它是一個異步任務調度工具,用戶使用 Celery 產生任務,借用中間人來傳遞任務,任務執行單元從中間人那里消費任務。
celery通過消息進行通信,通常使用一個叫Broker(中間人)來協調client(任務的發出者)和worker(任務的處理者). clients發出消息到隊列中,worker通過監測 broker中的任務發布情況來,若有則接收任務進行處理。
注:Celery 本身不是任務隊列, 是管理分布式任務隊列的工具. 它封裝了操作常見任務隊列的各種操作, 我們使用它可以快速進行任務隊列的使用與管理.
其原理大致如下:

當然關於celery還有兩個角色:
- celery beat: 任務調度, 根據配置文件發布定時任務。
- backend: 存儲結果的后端服務器。

三、應用場景
一、耗時耗資源的操作。
用戶觸發的一個操作需要較長時間才能執行完成時,可以把它作為任務交給Celery去異步執行,執行完再返回給用戶。這段時間用戶不需要等待,提高了網站的整體吞吐量和響應時間。
二、定時任務。
對一些需要進行定時操作的任務,比如上面提到的 每隔一個小時查詢一次天氣預報、或者例如 京東每幾秒執行首頁頁面靜態化操作(為了提升用戶訪問首頁的速度,由於加載動態頁面可能會大量的請求后端進行數據庫的查詢,故通常將動態頁面靜態化)、或者每天的某個時間點進行消息推送等。
三、延時操作。
對於一些需要延時操作,例如說 當用戶登錄成功或者注冊成功后,幾分鍾后給用戶發送郵件提醒用戶在哪個地方進行了登錄等操作,若這類延時操作交由主程序來進行操作,那么將會造成阻塞,即用戶一直得不到響應。
四、高並發的請求任務。
互聯網已經普及,人們的衣食住行中產生的交易都可以線上進行,這就避免不了某些時間極高的並發任務請求,如公司中常見的購買理財、學生繳費,在理財產品投放市場后、開學前的一段時間,交易量猛增,確認交易時間較長,此時可以把交易請求任務交給 Celery 去異步執行,執行完再將結果返回給用戶。用戶提交后不需要等待,任務完成后會通知到用戶(購買成功或繳費成功),提高了網站的整體吞吐量和響應時間,幾乎不需要增加硬件成本即可滿足高並發。
四、基本實現
