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-beat 时,celery.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。也可以同时使用这两项设置以进一步细化数据管理。

Celery 任务结果管理的 TTL 和清理任务时间线