celery作為一個(gè)分布式異步任務(wù)隊(duì)列管理工具,我們需要通過(guò)界面化的方式來(lái)進(jìn)行管控任務(wù)的執(zhí)行狀態(tài)和查看任務(wù)執(zhí)行結(jié)果,這里介紹的是flower后端管理頁(yè)面的內(nèi)容。
flower的啟動(dòng)
首先f(wàn)lower作為web頁(yè)面來(lái)管理celery后臺(tái)任務(wù),和任務(wù)隊(duì)列是隔離的,也就是flower的運(yùn)行與否并不會(huì)影響到任務(wù)隊(duì)列的真正執(zhí)行,但是flower中可以通過(guò)API接口來(lái)管理celery中的任務(wù)執(zhí)行。
在django工程目錄下面(和manage.py文件在一個(gè)層級(jí)),具體的執(zhí)行命令:
python manage.py celery flower --basic_auth=floweradmin:12345 --port=8083
由于本人在django工程中已經(jīng)設(shè)置了 BROKER_URL 所以在上述的flower啟動(dòng)命令中就沒(méi)有再次指定隊(duì)列url。
flower界面介紹
本片文章著重進(jìn)行flower界面的介紹,主要是因?yàn)闆](méi)有一個(gè)完整的文檔來(lái)進(jìn)行介紹,所以下面是詳細(xì)介紹flower界面中各個(gè)頁(yè)面展示的內(nèi)容,并且各個(gè)字段的含義。

Dashboard
Dashboard 頁(yè)面是展示異步任務(wù)隊(duì)列的主要情況,該頁(yè)面包括如下幾種狀態(tài)的任務(wù):
- Active: 表示worker從隊(duì)列中獲取到任務(wù),且正在執(zhí)行的任務(wù)數(shù)
- Processed: 表示worker從隊(duì)列中獲取到任務(wù)的總數(shù)據(jù)量
- Failed: 表示worker從隊(duì)列中獲取到任務(wù),且執(zhí)行失敗了的(異常退出)
- Successed: 表示worker從隊(duì)列中獲取到任務(wù),且執(zhí)行成功了的
- Retried: 表示worker從隊(duì)列中獲取到任務(wù),因?yàn)橐恍┢渌蛑匦聢?zhí)行的數(shù)量
所以,上述這些數(shù)量的關(guān)系如下:
Processed = Active + Received + Failed + Successed + Retried
其中 Received 表示該任務(wù)分配到了worker中,但是還沒(méi)有被處理的任務(wù)數(shù)量

Worker Name 表示的是執(zhí)行celery任務(wù)的worker名稱(chēng);
Status 表示的是該worker的狀態(tài),包括 Online (在線(xiàn)) 、 Offline(離線(xiàn)),重啟flower進(jìn)程,即可將Offline狀態(tài)的worker剔除掉;
Active / Processed / Failed / Successed / Retried 分別表示該worker正在執(zhí)行的任務(wù)數(shù)、該worker處理的總?cè)蝿?wù)數(shù)、處理失敗的任務(wù)數(shù)、處理成功的任務(wù)數(shù)、重試的任務(wù)數(shù);
Load Average 表示系統(tǒng)在 1min / 5min / 15min 內(nèi)的CPU平均負(fù)載(百分比)
Tasks
Tasks 頁(yè)面是展示所有worker接收到的任務(wù)的處理情況。下面對(duì)該表格中的做一些介紹

- Name: 表示該任務(wù)的名稱(chēng),默認(rèn)規(guī)則為該函數(shù)的路徑規(guī)則,例如
{模塊名}.{文件名}.{函數(shù)名} - UUID: 表示一個(gè)唯一字符串ID用于表示該任務(wù)
- State: 表示該任務(wù)的狀態(tài),包括: SUCCESS / FAILURE / STARTED / RECEIVED
- SUCCESS 表示該任務(wù)執(zhí)行完畢且成功
- FAILURE 表示該任務(wù)執(zhí)行失敗
- STARTED 表示該任務(wù)正在執(zhí)行
- RECEIVED 表示該任務(wù)在worker中,只是被接收而已
- args: 表示該任務(wù)的列表參數(shù)
- kwargs: 表示該任務(wù)的字典參數(shù)
- Result: 表示該任務(wù)函數(shù)的返回結(jié)果
- Received: 表示該任務(wù)在worker接收到的時(shí)間
- Started: 表示該任務(wù)在worker開(kāi)始執(zhí)行的時(shí)間
- Runtime: 表示該任務(wù)在worker真正執(zhí)行的耗時(shí)(單位:秒)
- Worker: 表示該任務(wù)所在的worker名稱(chēng)
Broker
Broker 頁(yè)面展示的是celery連接消息隊(duì)列的信息,包括消息隊(duì)列的訪(fǎng)問(wèn)URL,下面的截圖展示的是鏈接的RabbitMQ,當(dāng)然也可以鏈接Redis等。

- Name: 表示隊(duì)列的名稱(chēng)
- Messages: 表示該隊(duì)列的消息數(shù)量
- Unacked: 表示該隊(duì)列中還沒(méi)收到ack確認(rèn)的消息數(shù)量(該消息可能處于 RECEIVED 或是 STARTED)
- Ready: 表示該隊(duì)列中還未分配到worker的消息數(shù)量
- Consumers: 表示消費(fèi)者數(shù)量(即worker數(shù)量)
- Idle since: 表示該隊(duì)列空閑的最初時(shí)間,否則為 N/A
Monitor
Monitor 頁(yè)面展示的是celery后臺(tái)任務(wù)的曲線(xiàn)展示狀況。

寫(xiě)在最后
上面介紹完了flower管理頁(yè)面的使用,下面說(shuō)一下,在實(shí)際使用過(guò)程中,由于隊(duì)列阻塞,也就是消費(fèi)者消費(fèi)速率低于生產(chǎn)者的速率造成的情況,我們?cè)撊绾翁幚怼?/p>
這個(gè)時(shí)候我們?yōu)榱丝焖俳鉀Q這個(gè)問(wèn)題,想先盡快清空隊(duì)列該如何操作,重啟worker是解決不了問(wèn)題,并且worker重啟之后,原先在worker中正在處理的任務(wù),由于沒(méi)有返回ack給到隊(duì)列,這些任務(wù)將會(huì)重新放回隊(duì)列中,那么重啟worker之后,worker還是依然從隊(duì)列中獲取并重新執(zhí)行。
像上述截圖中,我們使用的是RabbitMQ作為消息隊(duì)列,那么我們自然可以通過(guò)RabbitMQ的命令或者是RabbitMQ-management來(lái)操作,但是想像一下,這些后臺(tái)都是放在平臺(tái)上,我們無(wú)法直接訪(fǎng)問(wèn)操作,該如何去清理,這里提供一下本人通過(guò)pika來(lái)制作的一個(gè)清空隊(duì)列的函數(shù),并且可以作為HTTP請(qǐng)求來(lái)進(jìn)行操作,可以設(shè)置最大清空隊(duì)列中消息數(shù)量來(lái)進(jìn)行處理,也可以全部清空。
具體的代碼可以訪(fǎng)問(wèn)git代碼。