Celery-redbeat中文介紹(一款基於Redis的改良scheduler)

本文分兩部分,第一部分是對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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章