本文分兩部分,第一部分是對Celery的簡單介紹(摘自https://foofish.net/celery-toturial1.html),第二部分介紹Celery-redbeat的原理、場景及用法(渣翻譯)。
一、Celery介紹
在一個應用服務中,對於時效性要求沒那麼高的業務場景,我們沒必要等到所有任務執行完才返回結果,例如用戶註冊場景中,保存了用戶賬號密碼之後,就可以立即返回,後續的賬號激活郵件,可以用一種異步的形式去處理,這種異步操作可以用隊列服務來實現。否則,如果等到郵件發送成功可能幾秒過去了。
Celery 是什麼?
Celery 是 Python 語言實現的分佈式隊列服務,除了支持即時任務,還支持定時任務,Celery 有5個核心角色。
1、Task
任務(Task)就是你要做的事情,例如一個註冊流程裏面有很多任務,給用戶發驗證郵件就是一個任務,這種耗時任務可以交給Celery去處理,還有一種任務是定時任務,比如每天定時統計網站的註冊人數,這個也可以交給Celery週期性的處理。
2、Broker
Broker 的中文意思是經紀人,指爲市場上買賣雙方提供中介服務的人。在Celery中它介於生產者和消費者之間經紀人,這個角色相當於數據結構中的隊列。例如一個Web系統中,生產者是處理核心業務的Web程序,業務中可能會產生一些耗時的任務,比如短信,生產者會將任務發送給 Broker,就是把這個任務暫時放到隊列中,等待消費者來處理。消費者是 Worker,是專門用於執行任務的後臺服務。Worker 將實時監控隊列中是否有新的任務,如果有就拿出來進行處理。Celery 本身不提供隊列服務,一般用 Redis 或者 RabbitMQ 來扮演 Broker 的角色
3、Worker
Worker 就是那個一直在後臺執行任務的人,也稱爲任務的消費者,它會實時地監控隊列中有沒有任務,如果有就立即取出來執行。
4、Beat
Beat 是一個定時任務調度器,它會根據配置定時將任務發送給 Broker,等待 Worker 來消費。
5、Backend
Backend 用於保存任務的執行結果,每個任務都有返回值,比如發送郵件的服務會告訴我們有沒有發送成功,這個結果就是存在Backend中,當然我們並不總是要關心任務的執行結果。
二、Celery-redbeat
1、什麼是Celery-redbeat?
Celery-redbeat是基於redis作爲celery的中間件(broker)時的一個任務調度器(scheduler),有效提高調度器(scheduler)健壯性。
2、爲什麼使用Celery-redbeat?
在Redis作爲消息中間件時,可以把監控任務這一部分也放在Redis上。雖然已經有celerybeatredis這樣現有的包實現類似效果,但是它和 django-celery 存在同樣的問題,就是在任務發生變化時,需要暫停並全部重載。
因此RedBeat的開發者,在利用Redis現有特性下完成了RedBeat這個包,解決了這個問題。
3、RedBeat的優勢
最大的變化就是,它將調度器從原來Celery進程中的定時任務調度器(默認作爲守護進程),改存在了Redis上。
因此,當任務創建或者發生變化的時候,調度器不再需要暫停和重載。利用Redis數據庫的特性,我們只需要更新Redis中的鍵名,調度器就會隨之發生改變。
調度器放在Redis上還有一個優點,就是對語言的兼容性變強了,只要可以綁定Redis,就可以處理各種語言上的celery問題。Redis加載調度器可以讓多任務啓動和關閉更加迅速和便利,也會讓程序更加健壯和穩定。
RedBeat還加了一個簡單的鎖(可以手動關閉),防止多個調度器同時作爲守護進程運行。
4、基本用法
安裝 |
pip install celery-redbeat |
在Celery配置文件中對Redbeat進行配置 |
redbeat_redis_url = "redis://localhost:6379/1" |
指定調度器 |
celery beat -S redbeat.RedBeatScheduler |
RedBeat限制多個調度器同時運行,配置參數手動關閉 |
redbeat_lock_key = None |
redbeat_key_prefix |
設置Redis中所有RedBeat相關鍵的前綴,不設置時,默認爲‘redbeat’ |
5、詳細介紹和使用詳見https://github.com/sibson/redbeat