【问题标题】:Django + Celery with long-term scheduled tasks具有长期计划任务的 Django + Celery
【发布时间】:2019-08-23 02:43:42
【问题描述】:

我正在开发一个 Django 应用程序,它严重依赖 Celery 任务调度,使用 Redis 作为后端。任务可以设置为在很长一段时间内运行,也可以在几秒/分钟内运行。

我已经阅读了 Redis 可见性超时和 timedelta 大于可见性超时的调度任务的后果(我也在以前的项目中处理它),所以我很感兴趣,如果有什么比我的解决方案是在需要执行“主”任务前 5 分钟运行另一个“助手”任务,安排“主”任务在所需时间运行,将任务 ID 存储在 DB 中,然后签入“主” " 任务,如果存储的任务 ID 是正在运行的任务。最后一部分(带有任务 ID 存储)是必需的,因为多次运行“帮助”任务可能会产生许多“主”任务实例,但使用这种方法,每个任务都会有不同的任务 ID。

我真的很讨厌这种方法听起来和它是如何工作的,好像任务计划从当前时间开始一个月运行,“帮助”和“主要”任务执行多达一百次。

我也知道这是一个悬而未决的问题,因此我更感兴趣的是一种简洁的解决方法,而不是解决方案本身。

【问题讨论】:

  • 为什么不将 django-celery-beat 与 cronschedule 任务一起使用 (pypi.org/project/django_celery_beat)?
  • @2ps,celery beat 是为运行周期性任务而创建的,如果仅用于解决相关问题,似乎过于复杂

标签: django redis celery


【解决方案1】:

在测试了可用选项后,我认为仅使用 RabbitMQ 作为代理可以解决整个问题。

虽然这对我来说是一个可行的选择,但缺少一些 redis 配置参数(例如池大小)使其无法用于那些使用托管服务且对打开的代理连接有一定限制的人。

【讨论】: