celery 視覺化 Celery 最佳實踐

2021-10-12 15:39:21 字數 2204 閱讀 4954

1.用好celery beat

如果你想更好的管理專案的定時任務,可以用celery beat代替crontab管理。celery不僅支援動態的非同步任務(通過delay呼叫),也支援定時任務執行。當然我們可以用crontab實現任務的定時執行,但是crontab是與專案**隔離的,為了更方便地管理定時任務用celery beat代替也是乙個不錯的選擇。celery beat是celery額外起的乙個程序,具體命令列:

該程序開啟後會根據配置定期的傳送任務到broker中,最終任務的執行還是由worker執行:

2.引數傳遞

大多數場景下傳遞任意資料時可行的,但是如果資料內容本身是可變的,那麼這時候就要仔細考慮了。假定引數是乙個物件,這個物件對映到資料庫中的一行資料,如果任務在等待執行的過程中該行資料有改變,那麼在任務執行的時候,使用到的這個物件就是乙個過期資料。所以盡量傳遞不變(這裡的不變與python不可變資料型別不是乙個概念)的引數。

3.序列化方式

celery支援多種序列化方式,但是每種序列化方式產生的資料大小是不同的,如果在broker吞吐量存在瓶頸的情況下,可以選擇產生資料較小的序列化方式

4.使用計畫任務

假定有這樣乙個場景,使用者建立了訂單,減少了商品庫存,但是還未支付,這時候需要給使用者乙個限定的支付時間如半個小時,如果半個小時之後這筆訂單還未支付,那麼就撤銷該訂單,重置商品庫存。這個時候可以用到celery的計畫任務,也就是任務發出後並不會馬上執行,會在指定的時間點執行。我們可以用countdown或者eta引數實現該功能:

eta給到的時間有時區的問題,所以我在上述**中減去了八個小時。

5.任務優先順序

如果執行的任務相同,但是這些相同的任務會有不同的優先順序,如果想使某個任務具有更高的優先順序,那麼可以使用priority引數來完成。

這裡會存在乙個問題。redis broker的priority只支援0、3、6、9四個級別,底層的實現方式是用不同的佇列來實現的。大致的做法是為每個優先的任務生成乙個佇列,更高優先順序的任務投遞到更高優先順序的佇列,worker工作的時候更傾向於從高優先順序佇列獲取任務。

6.broker的選擇

不要使用mysql作為broker。雖然celery支援mysql作為broker,但我們還是不要用mysql,因為如果任務量一旦上來,mysql會存在大量的磁碟io,不利於任務系統良好的執行。rabbitmq是官方推薦的broker,也是完全實現了amqp協議的broker。相比較而言,redis更輕量級,但也是乙個較好的選擇。

7.worker命名

給celery worker指定乙個唯一的名字,可以讓我們更好的區分不同的worker。可以用-n引數指定name

8.為不同的佇列開啟不同的worker

我們盡量給不同的任務指定不同的佇列,有的任務具有更高的優先順序,有的反而沒那麼重要,所以分開來是有必要的。在開啟的worker的時候指定佇列,執行一組相同的任務。

9.選擇合適的併發方式

celery提供了幾種併發方式,包括prefork、gevent、eventlet等,如果執行的任務是cpu密集型的可以選擇prefork的方式(也是預設的方式),如果是網路io密集型的可以選擇gevent或者eventlet,這兩者都用到了io多路復用的技術。選擇恰當的併發方式可能可以極大的提公升處理能力。併發數的選擇也需要考慮一下,並不是越多越好,多了需要處理大量的上下文切換,少了不能明顯提高效能,這裡可能需要乙個測試。

10.執行的冪等性

對於broker而言,任務重複下發是存在的,雖然這種可能性微乎其微。所以對於同乙個任務,即使多次執行,不會也不應該產生資料異常。這需要在**層面實現。

11.小心使用retry

retry的機制未深入研究,但是在我工作初期,因為不當地使用retry,導致任務指數級的增長,最終整個broker塞滿了訊息。大致是因為任務失敗後同時retry了兩次,並且下一次執行還是失敗,繼續兩次retry(此時總的是4次retry),如此指數增長。

12.給任務設定timeout

如果不給單個任務設定超時時間,一旦某個任務卡死(比如產生死鎖),整個worker將一直不可用,除非重啟。可以使用--time-limit引數指定超時時間。

13.接入sentry

接入sentry可以讓我們快速定位錯誤,解決問題。

14.backend設定

15.flower監控

flower是celery的乙個視覺化監控工具。我們可以從上面看到如worker工作情況、佇列長度等資訊,也可以執行遠端控制等操作。出現問題時,celery監控系統可能會幫助使用者更快的定位問題。

celery 視覺化 利用Celery實現定時任務

celery是乙個基於分布式訊息傳輸的非同步任務佇列,它專注於實時處理,同時也支援任務排程。在之前的文章python之celery的簡介與使用中,筆者簡單介紹了celery以及celery的使用。本文將會將會如何利用celery來實現定時任務。定時任務,在我們平時的工作中並不少見,比如定時備份資料庫...

celery系列 一 celery 相關配置

celery result backend amqp 官網優化的地方也推薦使用c的librabbitmq celery task result expires 1200 celery任務執行結果的超時時間,我的任務都不需要返回結果,只需要正確執行就行 celeryd concurrency 50 c...

celery 執行celery定時任務

場景 在虛擬機器上執行 python django celery redis 的定時任務 可能遇到的問題 如果在執行過程中,定時任務突然退出,並報以下錯誤,錯誤顯示,沒有許可權訪問一些目錄檔案 解決方案 1 關閉當前redis服務 在step 3中有描述如何關閉 2 以root使用者執行啟動redi...