使用 Redis¶
配置¶
配置非常簡單,只需要設置 Redis 數據庫的位置:
BROKER_URL = 'redis://localhost:6379/0'
URL 的格式為:
redis://:password@hostname:port/db_number
URL Scheme 后的所有字段都是可選的,並且默認為 localhost 的 6479 端口,使用數據庫 0。
可見性超時¶
可見性超時時間定義了等待職程在消息分派到其他職程之前確認收到任務的秒數。一定要閱讀下面的 警示 一節。
這個選項通過 BROKER_TRANSPORT_OPTIONS 設置:
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600} # 1 hour.
Redis 的默認可見性超時時間是 1 小時。
結果¶
如果你也想在 Redis 中存儲任務的狀態和返回值,你應該配置這些選項:
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
Redis 結果后端支持的選項列表見 Redis backend settings 。
警示¶
-
廣播信息默認隊所有虛擬主機可見。
你需要設置一個傳輸選項來給消息加上前綴,這樣消息只會被活動的虛擬主機收到:
BROKER_TRANSPORT_OPTIONS = {'fanout_prefix': True}
注意,你將不能與運行老版本的職程或沒有啟用這個選項的職程通信。
這個選項在以后將會使默認的,遷移宜早不宜遲。
-
如果任務沒有在 可見性超時 內確認接收,任務會被重新委派給另一個職程並執行。
這會在預計到達時間/倒計時/重試這些執行時間超出可見性超時時間的任務上導致問題;事實上如果超時,任務將循環重新執行。
所以你需要增大可見性超時時間,以符合你計划使用的最長預計到達時間。
注意 Celery 會在職程關閉的時候重新分派消息,所以較長的可見性超時時間只會造成在斷電或強制終止職程之后“丟失”任務重新委派的延遲。
周期任務不會受可見性超時影響,因為這是一個與預計到達時間/倒計時不同的概念。
你可以配置同名的傳輸選項來增大這個時間:
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 43200}
這個值必須是整數,單位是秒。
-
監視事件(用於 flower 或其他工具)是全局的,並且不會受虛擬主機設置的影響。
1這是 Redis 帶來的限制。Redis PUB/SUB 信道是全局的,並且不受數據庫序號影響。
-
Redis 在某些情況會從數據庫中驅除鍵。
如果你遇到了類似這樣的錯誤:
InconsistencyError, Probably the key ('_kombu.binding.celery') has been removed from the Redis database.
你可以配置 Redis 服務器的 timeout 參數為 0 來避免鍵被驅逐。