Celery 工作執行後在後端儲存的工作結果,如果長時間存在,可能會佔用儲存容量並影響性能。 Django-celery-beat 和 Celery 分別提供了可以清理後端數據的選項,以解決此問題。本文將介紹 `CELERY_TASK_RESULT_EXPIRES` 設置Django-celery-beat 的 `celery.backend_cleanup` 任務,並解釋兩者的使用建議。

1. CELERY_TASK_RESULT_EXPIRES:設置工作結果的有效期選項

CELERY_TASK_RESULT_EXPIRES 是設置單個工作結果在後端存在多長時間的選項,以秒為單位。該設置在 Celery 工作安排到後端時,以TTL(存活時間)的方式運作,使得工作結果在指定時間之後自動刪除。

  • 設置示例
    CELERY_TASK_RESULT_EXPIRES = 86400  # 24小時(以秒為單位)
  • 通過此設置,工作結果在24小時後將自動從後端刪除。TTL 設置在需要調整每個工作的有效期時非常有用,以避免後端積累不必要的數據。

2. Django-celery-beat 的 celery.backend_cleanup:定期清理任務

如果使用 Django-celery-beatcelery.backend_cleanup 任務將定期清理後端積累的舊工作結果。此清理任務預設為每天執行一次,可以在 Django 管理後台調整執行頻率,設置為更頻繁或更不頻繁執行。定期清理任務可防止後端積累舊數據,即使沒有 TTL 設置

  • 頻率設置示例:根據 Django 管理後台調整 celery.backend_cleanup 的執行頻率,如果實時數據較多,可以設置得更短,否則可以保持預設值(一天)。

3. 結論:應該選擇哪種設置?

CELERY_TASK_RESULT_EXPIREScelery.backend_cleanup 設置具有重疊的功能,因此只使用其中一個就足以執行後端的內存管理。不過,根據需求也可以同時啟用兩者。

  • 使用 Django-celery-beat 的情況下:由於 celery.backend_cleanup 任務定期執行後端清理,因此主要可以預約這個清理任務,而不需要設置 TTL
  • 通過代碼預約 Celery 工作的情況下:如果不使用 Django-celery-beat 直接編寫工作預約代碼,則建議設置 CELERY_TASK_RESULT_EXPIRES 以管理 TTL。這樣可以使每個工作結果在設定時間後自動刪除,從而有效地管理後端內存。

總結:只需 Django-celery-beat 的清理任務或 TTL 設置即可實現後端管理,對於 Django-celery-beat 用戶來說,預約清理任務是合適的,而對於通過代碼預約的情況,則建議使用 TTL 設置。還可以透過同時使用兩者來進行更細緻的數據管理。

Timeline of TTL and cleanup task for Celery task result management