1.工作流程
celery通過消息進行通信,通常使用一個叫Broker(中間人)來協client(任務的發出者)和worker(任務的處理者). clients發出消息到隊列中,broker將隊列中的信息派發給worker來處理。
一個celery系統可以包含很多的worker和broker,可增強橫向擴展性和高可用性能。
2.概念介紹
Brokers
Celery支持多種消息中間件作為Broker,即中間人。來在應用程序和Worker之間傳遞消息。
broker是一個消息傳輸的中間件,可以理解為一個郵箱。每當應用程序調用celery的異步任務的時候,會向broker傳遞消息,而后celery的worker將會取到消息,進行對於的程序執行。好吧,這個郵箱可以看成是一個消息隊列。其中Broker的中文意思是 經紀人 ,其實就是一開始說的 消息隊列 ,用來發送和接受消息。這個Broker有幾個方案可供選擇:RabbitMQ (消息隊列),Redis(緩存數據庫),數據庫(不推薦),等等
消息中間件 | 支持適配狀態 | 支持監控 | 支持遠程控制 |
---|---|---|---|
RabbitMQ | 穩定 | 是 | 是 |
Redis | 穩定 | 是 | 是 |
Amazon SQS | 穩定 | 否 | 否 |
Zookeeper | 實驗 | 否 | 否 |
backend
通常程序發送的消息,發完就完了,可能都不知道對方時候接受了。為此,celery實現了一個backend,用於存儲這些消息以及celery執行的一些消息和結果。Backend是在Celery的配置中的一個配置項 CELERY_RESULT_BACKEND ,作用是保存結果和狀態,如果你需要跟蹤任務的狀態,那么需要設置這一項,可以是Database backend,也可以是Cache backend
Worker
Worker是Celery提供的任務執行的單元,worker並發的運行在分布式的系統節點中。
3 分布式任務隊列 異步處理框架
它可以讓任務的執行完全脫離主程序,甚至可以被分配到其他主機上運行。我們通常使用它來實現異步任務(async task)和定時任務(crontab)。我們需要一個消息隊列來下發我們的任務。首先要有一個消息中間件,此處選擇rabbitmq (也可選擇 redis 或 Amazon Simple Queue Service(SQS)消息隊列服務)。推薦 選擇 rabbitmq 。使用RabbitMQ是官方特別推薦的方式,因此我也使用它作為我們的broker。
可以看到,Celery 主要包含以下幾個模塊:
-
任務模塊 Task
包含異步任務和定時任務。其中,異步任務通常在業務邏輯中被觸發並發往任務隊列,而定時任務由 Celery Beat 進程周期性地將任務發往任務隊列。
-
消息中間件 Broker
Broker,即為任務調度隊列,接收任務生產者發來的消息(即任務),將任務存入隊列。Celery 本身不提供隊列服務,官方推薦使用 RabbitMQ 和 Redis 等。
-
任務執行單元 Worker
Worker 是執行任務的處理單元,它實時監控消息隊列,獲取隊列中調度的任務,並執行它。
-
任務結果存儲 Backend
Backend 用於存儲任務的執行結果,以供查詢。同消息中間件一樣,存儲也可使用 RabbitMQ, redis 和 MongoDB 等。